`
kidiaoer
  • 浏览: 807361 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Spring参考手册 IOC

阅读更多
Spring参考手册 IOC

概述

        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实例。

	  
	  
分享到:
评论

相关推荐

    Spring Framework 开发参考手册

    Spring Framework 开发参考手册2.0 Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的。因此,我们说这些对象间存在依赖关系。 Java语言和...

    spring2[1].5-中文参考手册

    Spring可能是你的企业应用程序所需要的一站式解决方案,但Spring仍然是模块的,允许你只使用你所需的哪些部分,而无须附加上其他部分。你可以使用IoC容器,在其上使用Struts,...这份手册提供Spring的功能参考指南。

    spring framework 开发参考手册

    另外,必须感谢Christian Bauer(来自Hibernate团队) ,他改写了DocBook-XSL软件来创建Hibernate参考手册,我们才得以创建这份文档。 也需要感谢Russell Healy为本手册的部分内容进行的详细而极富价值的审核。

    Spring 2.0 开发参考手册

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 ...

    spring.net中文手册在线版

    IoC快速入门 25.1.简介 25.2.Movie Finder 25.2.1.开始建立MovieFinder应用程序 25.2.2.第一个对象定义 25.2.3.属性注入 25.2.4.构造器参数注入 25.2.5.总结 25.2.6.日志 25.3.应用程序上下文和IMessageSource接口 ...

    Spring2.52 开发手册

    spring2.52 Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。...这份手册提供Spring的功能参考指南。

    spring2.5 api 离线版

    Spring2.5-Reference_zh_CN.chm Spring2.5-中文参考手册.chm spring——AOP,IOC.doc Spring框架快速入门之简介.doc spring配置全书.doc Spring中的IOC与AOP详解.ppt

    spring参考资料

    Spring 是由 Rod Johnson 撰写,并在其著作 Expert One-on-One: J2EE Design and Development 中有提到过,它是个轻量级(Lightweight)容器(Container)、实现 IoC(Inversion of Control)、AOP(Aspect-oriented...

    Spring自学笔记-Ioc(控制反转)容器

    在自学Spring Framework 开发参考手册2.5时做的学习笔记,其中在遇到手册上不能理解的地方的时候,在网上找了一些比较好的文档也放在了里面。

    Sping技术手册 参考手册

    Spring技术手册这本书介绍了spring 2.0的新特性,诸如spring 2.0的新配置、新aop支持、增强的ioc、jdbc和form标签等新功能。它通过实际完成一个完整的spring项目示例,展示了与spring相关api的使用技巧,能够显著...

    spring2.5.chm帮助文档(中文版)

    Spring Framework 开发参考手册 目录 1. 简介 1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的...

    spring完全学习实例(一)

    针对《spring framework参考手册》来实现实例,几乎涵盖了全部Spring的J2EE开发。主要包括Spring的IoC、AOP(注释注入、Schema注入、与AspectJ的集成、有接口和无接口的实现的界面编程)、中间数据访问层(编程事...

    spring3.1中文参考文档

    spring3.1中文参考文档,南磊翻译,现在有4章,目录如下: 第一部分 Spring framework概述.......................................................................................................................

    Spring API

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    spring4.2.5reference.chm

    Spring是JAVA中最流行的库,主要包含IOC和AOP两大核心模块,它和基于它的一系列开源项目构建了一个完善而强大的生态系统

    ASP.NET编程宝典(十年典藏版)》光盘源码1

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

    《Java Web编程宝典(十年典藏版)》光盘源码

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

Global site tag (gtag.js) - Google Analytics