Spring参考手册 IOC

Spring参考手册 IOC
[code]

概述

org.springframework.beans和org.springframework.context包提供Spring框架的IOC容器的基 本功能,BeanFactory接口提供一个高级的配置机制用来管理对象,ApplicationContext接口是BeanFactory接口的子接 口,添加一些额外的功能,比如AOP特性,资源处理,事件派发和应用层特定的上下文(比如WebApplicationContext)。

BeanFactory接口是Spring IOC容器的核心接口,主要负责实例化,配置对象和组装对象依赖关系。其实质是一个工厂类,可以维护Bean及Bean之间的依赖关系。

容器中的Bean定义是由BeanDefinition类表示的。

三种实例化Bean的方式: 构造函数, 静态方法, 实例方法。
依赖注入

Spring 会在容器创建时验证Bean实例的配置,比如Bean的引用属性是否引用一个有效的Bean,但是Bean属性本身是直到Bean实例被创建时才设置的, 而除了单例对象和预实例化的对象,其他Bean是在请求时才创建的。这意味着Spring即使加载正确,也可能在请求Bean实例时抛出异常。 PropertyEditor类知道如何将属性从一种格式转换成另一种格式。

设值方法注入可以接纳重新配置和重新注入。

构造方法注入可以保证返回给客户的对象是完全初始化的,但是一旦初始化后不能重新配置和重新注入。
集合合并

Spring2.0支持集合合并,子类Bean实例可以合并和重写抽象父类Bean实例的集合属性。示例如下:
xml 代码

1. <beans>
2. <bean id="parent" abstract="true" class="example.ComplexObject">
3. <property name="adminEmails">
4. <props>
5. <prop key="administrator">administrator@somecompany.com</prop>
6. <prop key="support">support@somecompany.com</prop>
7. </props>
8. </property>
9. </bean>
10. <bean id="child" parent="parent">
11. <property name="adminEmails">
12. <!-- the merge is specified on the *child* collection definition -->
13. <props merge="true">
14. <prop key="sales">sales@somecompany.com</prop>
15. <prop key="support">support@somecompany.co.uk</prop>
16. </props>
17. </property>
18. </bean>
19. <beans>


范型

Spring2.0支持范型集合属性的映射。
Depends-on

大部分情况下,依赖关系是通过设值方法(ref元素)定义的,还是有些情况依赖关系不是很直接,比如某个类的实例化需要执行一段静态初始化代码(如注册数据库驱动),depends-on支持逗号分隔的属性值,可以显式指定必须之前初始化的Bean实例。
懒加载

Spring 的缺省行为是容器创建时初始化所有的单例类,可以使用lazy-init属性指定一个Bean在请求时再初始化。需要注意的是,如果一个非懒初始化的单例 Bean引用一个懒初始化的Bean,那么即便你指定了lazy-init,Spring还是会执行初始化。
可以在容器级别配置default-lazy-init属性。
自动绑定

Spring 提供几种模式自动解决Bean实例之间的依赖关系,这是通过autowire属性实现的,目前支持五种自动绑定模式:none,byname, byType,constructor,autodetect。需要注意的是显式依赖指定总是会重写自动绑定,当前还不支持简单属性的自动绑定。

自动绑定可以极大的减轻 XML属性配置的工作量,但是有时候可能会产生二义性。
方法注入

如果一个单例Bean的某个方法调用时需要获取一个非单例Bean的实例,因为容器只会实例化单例Bean一次,Spring提供三种方式解决此问题。

单例Bean实现BeanFactoryAware接口,主动查找需要的非单例Bean,这种方式的缺点是造成对Spring框架的依赖。
查询方法注入:单例Bean实例定义一个抽象的查找方法,通过<lookup-method></lookup-method>元素进行配置,Spring会使用CGLIB库动态实现一个子类,重写查找方法。这种方式的缺点是测试包含抽象查找方法的Bean类比较困难,另外包含方法注入的 Bean实例不能被序列化。
替换方法注入:这种方式比较高级,需要使用的时候可以查阅参考手册。
实例范围

Spring 框架可以控制创建的Bean实例的范围,目前支持五个范围设置,其中三个应用于基于WEB的应用程序,这五个范围是:singleton, prototype,request,session,global session。Spring2.0也支持用户自定义范围。

如 果需要将request,session,global session范围内的对象依赖注入到prototype,singleton范围的实例中,需要使用Spring框架提供的代理机制,为什么需要使用代 理机制?假定一个singleton实例依赖一个基于会话的实例,因为单例实例只会被初始化一次,如果按惯常的配置方式,将导致singleton实例总 是使用的同一个依赖实例,这显然不是我们需要的结果。使用代理机制,只需要加一行配置代码即可,示例如下:
xml 代码

1. <bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
2. <!-- this next element effects the proxying of the surrounding bean -->
3. <aop:scoped-proxy/>
4. </bean>
5. <!-- a singleton-scoped bean injected with a proxy to the above bean -->
6. <bean id="userService" class="com.foo.SimpleUserService">
7. <!-- a reference to the proxied 'userPreferences' bean -->
8. <property name="userPreferences" ref="userPreferences"/>
9. </bean>

通过指定 merge=true,child实例将拥有parent实例的所有属性并重写parent实例的同名属性值。
标记接口

Spring 提供几个标记接口改变容器中Bean实例的行为,Spring框架使用BeanPostProcessor回调这些标记接口的方法。
包括:
InitializingBean……允许Bean实例在所有的属性被设置后,执行初始化动作,通常应该避免使用此接口,因为可以配置init-method方法。
DisposableBean……允许Bean实例在容器销毁时得到回调,通常应该避免使用此接口,因为可以配置destroy-method方法。
BeanFactoryAware…… 允许Bean实例获取当前BeanFactory的实例,通常不推荐使用此接口,因为会与Spring紧藕合,有一个可选方式是使用 ObjectFactoryCreatingFactoryBean,这个类本身实现了BeanFactoryAware接口。
BeanNameAware……允许Bean实例获取其在BeanFactory中的id属性。

优雅退出

基 于WEB的ApplicationContext实现在WEB应用程序关闭时,可以优雅的关闭容器。非WEB应用中如果希望应用关闭时,容器可以调用单例 Bean的销毁方法,优雅退出,必须向JVM请求一个shutdown钩子,这通过调用ApplicationContext实现的 registerShutdownHook()方法来实现,示例代码如下:
java 代码

1. AbstractApplicationContext ctx
2. = new ClassPathXmlApplicationContext(new String []{"beans.xml"});
3. // add a shutdown hook for the above context...
4. ctx.registerShutdownHook();

Bean定义继承

可以定义一个Bean,其配置数据来自于另外一个Bean,子Bean可以重写父Bean的属性,或添加一些值,使用这种Bean定义的继承可以节省很多工作量。子Bean是通过parent属性标识的。示例配置如下:
xml 代码

1. <bean id="inheritedTestBean" abstract="true"
2. class="org.springframework.beans.TestBean">
3. <property name="name" value="parent"/>
4. <property name="age" value="1"/>
5. bean>
6. <bean id="inheritsWithDifferentClass"
7. class="org.springframework.beans.DerivedTestBean"
8. parent="inheritedTestBean" init-method="initialize">
9. <property name="name" value="override"/>
10. <!-- the age property value of 1 will be inherited from parent -->
11. bean>

容器扩展点

BeanPostProcessor…… 此接口定义许多回调方法,开发人员可以提供自己的实例化,依赖注入等逻辑,容器通常在已经实例化Bean后调用这些接口方法。通常 BeanPostProcessor用来检测标记接口,检查注记(Annotation)来扩展Spring IOC容器,许多AOP框架类通过实现BeanPostProcessor来提供代理机制。
BeanFactoryPostProcessors…… 此接口主要用来操作Bean定义,可以在容器实例化Bean之前读取和改变Bean配置元数据。PropertyResourceConfigurer和 PropertyPlaceholderConfigurer就是BeanFactoryPostProcessor接口的实现。
FactoryBean…… 此接口用来自定义Bean实例化逻辑,相当于一个Bean工厂类,核心方法getBean返回FactoryBean创建的实例,Spring框架提供很多FactoryBean接口的实现。

ApplicationContext

国际化:ApplicationContext 接口扩展MessageSource接口提供国际化功能,当ApplicationContext加载时会自动查找上下文中id为 messageSource的Bean实例,如果没有找到将使用框架提供的StaticMessageSource,然后将消息请求委托给 MessageSource实例。
事件派发:ApplicationContext 通过ApplicationEvent和ApplicationListener提供事件派发功能。如果一个Bean实例实现了 ApplicationListener接口,每次ApplicationEvent事件发送到ApplicationContext时,Bean实例都 会接到通知,这实际上是访问者模式的实现。开发者可以扩展ApplicationEvent实现自己的事件类,然后在合适的时候调用 ApplicationContext的publishEvent发布事件。
访问资源文件:ApplicationContext 实现ResourceLoader,接口可以用来加载资源文件,Bean实例可以实现ResourceLoaderAware标记接口,这样在 ApplicationContext初始化实例时,会将自己传递给Bean实例。另外Bean实例也可以提供Resource属性,由 ApplicationContext进行依赖注入。Resource属性值可以是简单的路径字符串,Spring框架提供PropertyEditor 转换这些路径字符串为Resource实例。


[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值