Spring4的知识应用总结(四)——Bean的生命周期和注解方式配置

来源:互联网 发布:京东 淘宝 显卡 编辑:程序博客网 时间:2024/06/13 13:23

Bean的生命周期和注解方式配置



一、Bean的生命周期

        Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. 
        Spring IOC 容器对 Bean 的生命周期进行管理的过程:
        通过构造器或工厂方法创建 Bean 实例
        为 Bean 的属性设置值和对其他 Bean 的引用
        调用 Bean 的初始化方法
        Bean 可以使用了
        当容器关闭时, 调用 Bean 的销毁方法
        在 Bean 的声明里设置init-methoddestroy-method 属性, 为 Bean 指定初始化和销毁方法.

        <!--  
                1. 默认情况下, IOC 容器中的 bean 是单例的! 若对象是单例的, 则在创建 IOC 容器时即创建 bean 的实例并对 bean 的属性进行初始化. 
                2. 可以通过 bean 的 scope 属性来修改 bean 的作用域. 若取值为 prototype, 则 bean 为原型的: 每次向容器获取实例, 得到的都是一个新的对象.
而且, 不在创建 IOC 容器时创建 bean 的实例了. 
                3. IOC 容器中 bean 的生命周期: 
                        3.1 一般地, 讨论 bean 的生命周期, 是建立在 bean 是单例的基础上的. 
                        3.2 可以为 bean 指定 init 和 destroy 方法
                        3.3 还可以通过 bean 的后置处理器来更加丰富 bean 的生命周期方法(面试时.).
        -->

        <bean id="helloWorld" class="com.atguigu.spring.helloworld.HelloWorld" scope="singleton"
init-method="init"destroy-method="destroy">
                <property name="userName" value="atguigu"></property>
        </bean>

Bean 后置处理器

        Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
        Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
        对Bean 后置处理器而言, 需要实现interface BeanPostProcessor接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:postProcessAfterInitialization()postProcessBeforeInitialization()

添加 Bean 后置处理器后 Bean 的生命周期

       Spring IOC 容器对 Bean 的生命周期进行管理的过程:
                通过构造器或工厂方法创建 Bean 实例
                为 Bean 的属性设置值和对其他 Bean 的引用
                将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
                调用 Bean 的初始化方法
                将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
                Bean 可以使用了
                当容器关闭时, 调用 Bean 的销毁方法


二、其他方式配置Bean


实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

        Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean
        工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject方法所返回的对象 

                public class CarFacotryBean implements FactoryBean{  
                        private String brand;  
                        public void setBrand(String brand)  
                        {this.brand = brand; }  
                        @Override  
                        public Object getObject() throws Exception{}
  
                        @Override  
                        public Class getObjectType(){}  
    
                <!--通过FactoryBean来配置bean的实例  
                    class:指向自定义的CarFacotryBean  
                property:配置CarFacotryBean的属性,  
                实际返回的实例是CarFacotryBean的getObject()方法返回的实例  
                 -->  

                <bean id = "car" class="com.bean.factory.CarFacotryBean">  
                        <property name="brand" value = "Bas"></property>  
                </bean> 


三、基于注解配置Bean和Bean的属性

在 classpath 中扫描组件

        组件扫描(component scanning):  Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件. 
        特定组件包括:
                @Component: 基本注解, 标识了一个受 Spring 管理的组件
                @Respository: 标识持久层组件
                @Service: 标识服务层(业务层)组件
                @Controller: 标识表现层组件
        对于扫描到的组件,Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写.也可以在注解中通过 value 属性值标识组件的名称

        当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明<context:component-scan>
                base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类. 
                当需要扫描多个包时, 可以使用逗号分隔.
                如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类,示例:
                                <context:include-filter> 子节点表示要包含的目标类
                                <context:exclude-filter> 子节点表示要排除在外的目标类
                                <context:component-scan> 下可以拥有若干个 <context:include-filter> 和 <context:exclude-filter> 子节点
                                <context:include-filter> 和 <context:exclude-filter> 子节点支持多种类型的过滤表达式:
annotation  assinable aspectj regex custom(前面两个很常用)

组件装配

        <context:component-scan> 元素还会自动注册 AutowiredAnnotationBeanPostProcessor 实例, 该实例可以自动装配具有@Autowired 和 @Resource 、@Inject注解的属性.

使用 @Autowired 自动装配 Bean

        @Autowired 注解自动装配具有兼容类型的单个 Bean属性
                构造器, 普通字段(即使是非 public), 一切具有参数的方法都可以应用@Authwired 注解
                默认情况下, 所有使用 @Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置 @Authwired 注解的 required 属性为 false
默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @Qualifiter 已指定注入 Bean 的名称
                @Authwired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配.
                @Authwired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean. 
                @Authwired 注解用在java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值

使用 @Resource 或 @Inject 自动装配 Bean

        Spring 还支持 @Resource 和 @Inject 注解,这两个注解和 @Autowired 注解的功用类似
        @Resource 注解要求提供一个 Bean 名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为 Bean 的名称
        @Inject 和 @Autowired 注解一样也是按类型匹配注入的 Bean, 但没有 reqired 属性
        建议使用 @Autowired 注解




0 0