spring装配

5. Spring的Bean的自动装入

     Spring IOC 容器可以帮助自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式。autowire 属性的值有一下几个值,byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean,在这种情况下,Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配。byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同。constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂。所以最后一种不推荐使用。当然针对这种自动装配还是不建议使用的,因为在实际的开发过程中很少使用,这样做虽然省事,但是不利于维护。在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了。autowire属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之。

     Spring 2.5 对自动装配特性进行了增强. 可以通过注解 setter 方法, 构造器, 字段, 甚至任意方法来装配特定的属性。要让 Spring 自动装配具有 @Autowired 或 @Resource 的 Bean 属性, 需要在 IOC 容器里注册 AutowiredAnnotationBeanPostProcessor 。@Autowired 注解自动装配具有兼容类型的单个 Bean属性。默认情况下, 所有使用@Autowired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置@Autowired 注解的 required 属性为 false。构造器, 普通字段(即使是非 public), 一切具有参数的方法都可以应用@Autowired 注解,@Autowired注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配。@Autowired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean。@Autowired 注解用在 java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值,默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称.但该注解只能用于修饰字段, 不能用于修饰方法。@Resource 通过名称自动装配 Bean 属性,如果找不到的话就按照类型匹配,构造器、普通字段(即使是非 public), 一切具有参数的方法都可以应用 @ Resource 注解,默认情况下, Spring 将试着找出和属性名称相同的 Bean. 也可以在 @Resource 注解的 name 属性里指定 Bean 的名称。

6. Spring容器的自动扫描

     Spring 2.5 提供的一个强大特性. 它能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件,特定组件包括:@Component: 基本注解, 标识了一个受 Spring 管理的组件,@Respository: 标识持久层组件,@Service: 标识服务层(业务层)组件,@Controller: 标识表现层组件。当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明单独的 <context:component-scan>, 让 Spring 扫描这些组件. 在这个元素里, 需要为组件扫描指定包. 指定扫描后, Spring 将扫描指定的包及其子包. 当存在多个需要扫描的包时, 可以使用逗号分隔。<context:component-scan> 元素还会自动注册 AutowiredAnnotationBeanPostProcessor 实例, 该实例可以自动装配具有 @Autowired 和 @Resource 注解的属性。对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在组件里显示为组件定义名称。

7. Spring容器中Bean的获取方式

    创建 Bean的方式主要有以下几种方法比较常用:通过调用静态工厂方法创建 。调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节。要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数。还可以通过调用实例工厂方法创建 Bean。实例工厂方法将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节,要声明通过实例工厂方法创建的 Bean,在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean,在 factory-method 属性里指定该工厂方法的名称,使用 construtor-arg 元素为工厂方法传递方法参数。

8. Spring容器中Bean的作用域

    在 Spring 2.x 里, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域。 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建一个实例, 整个 IOC 容器范围内都能共享该实例。 所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。

9. Spring容器中Bean的生命周期

    Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务。在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。Spring 2.5 里也可以给初始化和销毁方法添加生命周期注解 @PostConstructor 和 @PreDestory,为了让 Spring 调用初始化和销毁方法, 需要在 IOC 容器里注册 CommonAnnotationBeanPostProcessor 实例,或者在 <beans> 中添加 context Schema 定义, 然后在配置文件中添加<context:annotation-config/>                                       元素, 此时 Spring 会自动注册 CommonAnnotationBeanPostProcessor 实例。

10. Spring的后置处理器(Bean后置处理器和BeanFactory后置处理器)

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

         通过构造器或工厂方法创建 Bean 实例

        为 Bean 的属性设置值和对其他 Bean 的引用

        将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

        调用 Bean 的初始化方法

         将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

        Bean 可以使用了

        当容器关闭时, 调用 Bean 的销毁方法

注册 Bean 后置处理器, 只需要在配置文件里声明声明一个该处理器的实例, ApplicationContext 会探测到实现了 BeanPostProcessor 接口的 Bean 并进行注册。若初始化和销毁方法是通过添加生命周期注解 @PostConstructor 和 @PreDestory 实现的, 则自定义的 Bean 后置处理器将无法工作. 其原因是 CommonAnnotationBeanPostProcessor 的优先级比 自定义的 Bean 后置处理器的优先级高. 结果在对路径检查之前初始化方法已经被调用。要定义 Bean 后置处理器的处理顺序, 需要让 Bean 后置处理器的实例实现 Ordered 或者 PriorityOrdered 接口, 在 getOrder() 方法中返回顺序值. 该方法返回的数值越低优先级越高. 另: PriorityOrdered 接口返回的顺序值总优先于 Ordered 接口返回的顺序值, 而 CommonAnnotationBeanPostProcessor 实现了PriorityOrdered 接口。

Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量。

注册 PropertyPlaceholderConfigurer, Spring2.5: 可通过 <context:property-placeholder> 元素简化:<beans> 中添加 context Schema 定义,在配置文件中加入如下配置: <context:property-placeholder location="classpath:C3P0_config.properties" />。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值