spring4.xJava学习笔记

Spring学习系列--2.配置Bean

2016-07-13  本文已影响475人  行者N

目录

  1. 待完善

Spring Bean

getBean

  1. 利用id
Car car1 = (Car) context.getBean("car1");
  1. 利用XXX.class 这种需要容器中类唯一,如果两个类ID不同 ,用这种方法会报错。好处是不需要再转型
UserEntity user = context.getBean(UserEntity.class);
  1. 还有一些不常用的,没有整理。

使用xml配置bean

  1. 属性注入,<property> 主要是用来注入一些字面值,比如String ,int 等
<!-- 使用property 注入car -->
    <bean id="car1" class="com.nina.spring.bean.Car">
        <property name="brand" value="Audi"></property>
        <property name="price" value="20000"></property>
    </bean>
  1. 构造方法注入, <constructor-arg> 这里主要,注入属性的个数,需要与对应bean中有参的构造器一致,否则会提示没有对应参数的构造器
<!-- 使用构造器 注入 -->
    <bean id="car2" class="com.nina.spring.bean.Car">
        <constructor-arg type="java.lang.String" value="Toyot"></constructor-arg>
        <constructor-arg type="double" value="300000"></constructor-arg>
    </bean>
  1. 如果字面值包含特殊字符可以用 <![CDATA[]]>包裹
<!-- 使用property 注入car3 -->
    <bean id="car3" class="com.nina.spring.bean.Car">
        <property name="brand">
            <value><![CDATA[<SANGTanna&&>]]></value>
        </property>
        <property name="price" value="20000"></property>
    </bean>
  1. 注入类,使用<ref>
<!-- car1 是之前的car的id ref 用来引用类 -->
    <bean id="person1" class="com.nina.spring.bean.Person">
        <property name="age" value="20"/>
        <property name="name" value="HuangSang"/>
        <property name="car" ref="car1"/>
    </bean>
  1. 还可以用使用内部bean
  2. null 值,使用 <null/>
  3. 级联属性赋值,属性需要初始化后,才可以使用级联赋值。
<bean id="person1" class="com.nina.spring.bean.Person">
        <property name="age" value="20"/>
        <property name="name" value="HuangSang"/>
        <property name="car" ref="car1"/>
        <property name="car.brand" value="MAITeng"></property>
    </bean>
  1. 集合属性 list map 需要使用 entry
<property name="carList">
            <list>
                <ref bean="car1" />
                <ref bean="car2" />
                <ref bean="car3" />
            </list>
        </property>
        <property name="carMap">
            <map>
                <entry key="AA" value-ref="car1"></entry>
                <entry key="BB" value-ref="car2"></entry>
            </map>
        </property>
  1. properties 使用 pros
    <bean id="dataSource" class="com.nina.spring.bean.DataSource">
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="pass">shordaao</prop>
            </props>
        </property>
    </bean>
  1. 配置单例的集合bean,需要导入util命名空间
<util:list id="cars">
        <ref bean="car1"/>
        <ref bean="car2"/>
    </util:list>
    
    <bean id="person2" class="com.nina.spring.bean.Person">
        <property name="carList" ref="cars"></property>
    </bean>
  1. p命名空间,需要先导入,
<bean id="person3" class="com.nina.spring.bean.Person" p:age="399" p:car-ref="car3">
    </bean>

  1. 自动装配, 在bean 的属性里面,指定autowire的模式byType,byName
<bean id="person4" class="com.nina.spring.bean.Person" autowire="byType"></bean>
  1. bean 之间的关系,继承和依赖。子bean可以继承父bean的所有属性,并可以覆盖,父bean,如果只是用作配置模板,可以指定 abstract=“true” , 这样不能实例化,同时,抽象bean,可以不指定 class 属性。
<bean id="address" class="com.nina.spring.bean.Address" p:street="wudaokou">
        <property name="city" value="Beijing"></property>
    </bean>
    
    <bean id="address2" class="com.nina.spring.bean.Address" parent="address" p:street="xihongmen"></bean>
  1. bean的作用域
scope="singleton" 默认是单例的,就是每次获得的是同一个bean,容器初始化就创建bean
 scope="prototype" 每次向容器获取bean,都会产生一个新的bean,调用时才会创建
 
  1. 使用外部属性文件,Spring 提供了一个PropertyPlaceHolderConfigurer的BeanFactory 后置处理器,这个处理器允许用户将Bean配置的部分内容移到属性文件中,可以在Bean配置中使用${var}的变量。Spring还允许属性文件中引进 ${propName},以实现属性间的相互引用。
<!-- 导入配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
    </bean>
  1. 配置文件中使用Spel,spel类似于el表达式,以#{},来处理。其中可以引用字面变量,可以引用bean(id),引用属性(xx.xx),引用方法。
  2. bean的生命周期。可以有以下顺序,
<bean id="car" class="com.nina.spring.bean.Car" init-method="clone" destroy-method="finalize">
<property name="brand" value="#{'SangTaNa'}"></property>
</bean>
  1. bean的后置处理器。Spring允许使用bean的后置处理器在调用初始化方法前对bean进行额外处理。需要实现接口BeanPostProcessor, 在xml配置中,只需要配置改bean的class,不需要ID,另外,这种bean 会对所有的bean在init前后进行操作。有必要在方法中进行判断
public class Tree implements BeanPostProcessor {

    public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
        // TODO Auto-generated method stub
        return null;
    }

    public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
        // TODO Auto-generated method stub
        return null;
    }

}
  1. 通过静态工厂方法来配置bean,按例子,获取的bean是car1,配置的class是工厂的,标注获取的方法,factory-method,如果需要参数,则通过 constructor-arg 配置
<bean id="car1" class="com.nina.spring.factory.SimpleBeanFactory" factory-method="getCar">
        <constructor-arg value="aa"></constructor-arg>
    </bean>
  1. 通过实例工厂方法来配置bean,先需要创建工厂本身,再获取bean
  2. 通过FactoryBean,配置。

基于注解的方式类配置bean

组件扫描

Spring 能够从classpath下自动扫描和实例化具有特定注解的组件

  1. xml中配置 需要导入context命名空间
<context:component-scan base-package="com.nina.spring"></context:component-scan>

  1. 默认的id为类名的第一个字母小写,如果有特殊要求可以使用value属性,eg.@Service(vallue="ddd"),其实可以写为(“ddd”)
  2. 可以通过 resour-pattern 指定扫描的资源

  1. 包含什么需要 use-default-filters属性配合
<context:component-scan base-package="com.nina.spring" use-default-filters="true">
        <context:exclude-filter type="annotation" expression=""/>
    </context:component-scan>
  1. 注解建立bean之间的关联关系
  1. 泛型依赖注入,Spring 可以为子类注入子类对应的泛型类型的成员变量引用(Spring4.0的新特性哦)
public class User implements Serializable {

    private Long id;
    private String name;
}

public class BaseService<T> {

    @Autowired
    protected BaseRepository<T> repository;
    
    public void add(){
        System.out.println("service add ...");
        System.out.println(repository);
    }
    
}

public class BaseRepository<T> {

}

@Service
public class UserService extends BaseService<User> {

}

@Repository
public class UserRepository extends BaseRepository<User> {

}

public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-generic.xml");
        UserService service = (UserService) ctx.getBean("userService");
        service.add();
    }

有关Bean的基础配置注入,暂时先告一段落。

上一篇 下一篇

猜你喜欢

热点阅读