概述
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 代码
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">administrator@somecompany.com</prop>
<prop key="support">support@somecompany.com</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<!-- the merge is specified on the *child* collection definition -->
<props merge="true">
<prop key="sales">sales@somecompany.com</prop>
<prop key="support">support@somecompany.co.uk</prop>
</props>
</property>
</bean>
<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实例定义一个抽象的查找方法,通过元素进行配置,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 代码
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<!-- this next element effects the proxying of the surrounding bean -->
<aop:scoped-proxy/>
</bean>
<!-- a singleton-scoped bean injected with a proxy to the above bean -->
<bean id="userService" class="com.foo.SimpleUserService">
<!-- a reference to the proxied 'userPreferences' bean -->
<property name="userPreferences" ref="userPreferences"/>
</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 代码
AbstractApplicationContext ctx
= new ClassPathXmlApplicationContext(new String []{"beans.xml"});
// add a shutdown hook for the above context...
ctx.registerShutdownHook();
Bean定义继承
可以定义一个Bean,其配置数据来自于另外一个Bean,子Bean可以重写父Bean的属性,或添加一些值,使用这种Bean定义的继承可以节省很多工作量。子Bean是通过parent属性标识的。示例配置如下:
xml 代码
<bean id="inheritedTestBean" abstract="true"
class="org.springframework.beans.TestBean">
<property name="name" value="parent"/>
<property name="age" value="1"/>
bean>
<bean id="inheritsWithDifferentClass"
class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBean" init-method="initialize">
<property name="name" value="override"/>
<!-- the age property value of 1 will be inherited from parent -->
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 Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...
### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...
IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 优点 1. 简化对象的创建:IoC ...
在Spring框架中,IoC(Inversion of Control)容器是其核心特性之一,它负责管理对象的生命周期和依赖关系。IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试...
Spring-IoC容器
Spring IoC容器是Spring框架的核心,它负责管理应用对象的生命周期和依赖关系。通过对IoC(Inversion of Control,控制反转)的实现,Spring容器将对象的创建和组装工作从应用代码中分离出来,使得应用更易于测试和...
**Spring的IoC容器详解** Spring框架的核心特性之一是依赖注入(Dependency Injection,简称DI),而实现这一特性的核心组件就是IoC(Inversion of Control)容器。IoC容器是Spring框架的心脏,它负责管理对象的...
Spring IOC 容器是Java开发中非常关键的组件,它是Spring框架的核心部分,负责管理对象的生命周期和依赖关系。本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助...
使用spring的Ioc容器组装各种组件总结
在“Spring基础:IoC容器(1)”这个主题中,我们将深入探讨Spring的核心组件——IoC容器,以及它如何管理对象的生命周期和依赖关系。 IoC(Inversion of Control),也称为控制反转,是一种设计模式,它将对象的创建...
本篇文章将深入探讨Spring实现原理,阐述IoC容器的优点,并指导如何在Eclipse中创建一个Spring的Web应用。 首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的...
**Spring IOC 容器应用实例** Spring 框架的核心组件之一是 Inversion of Control (IoC) 容器,也常被称为依赖注入(Dependency Injection)容器。IoC 是一种设计模式,它将对象的创建和管理从应用程序的业务逻辑中...
Spring框架的IOC(Inversion of Control,控制反转)容器是其核心组件,它负责管理和装配应用中的对象。在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 ...
在本篇博文中,我们将深入探讨Spring框架的基础概念,特别是其核心特性——控制反转(Inversion of Control,IoC)容器。IoC容器是Spring框架的基石,它负责管理对象的生命周期和对象间的依赖关系。通过IoC,我们...
Spring容器中IOC Spring容器中IOC(Inverse of Control,控制反转)是Spring框架的核心功能之一。IOC容器是Spring Framework的核心组件之一,负责管理应用程序中的对象实例,控制对象的生命周期,并提供依赖注入的...
Spring IOC 容器启动流程分析 Spring IOC 容器是 Java 企业级应用程序的核心组件之一,它提供了一个统一的依赖注入机制,使得应用程序的组件之间能够松耦合。Spring IOC 容器的启动流程是整个 Spring 框架的核心...