Spring 的 Bean
Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean
在 Spring 中有两个最基本、最重要的包,即 org.springframework.beans 和 org.springframework.context ,在这两个包中,为了实现无侵入式的框架,代码中大量地使用了 Java 中的反射机制,通过动态调用来避免硬编码,为 Spring 反向控制提供了基础保证,在这两个包中,最重要的类时 BeanFactory 和 ApplicationContext , BeanFactory 提供一种先进的配置机制来管理任何种类的 Bean , ApplicationContext 是建立在 BeanFactory
Bean 的标识 (id 和 name)
Id 属性具有唯一性,每一个 Bean 只能有一个对应的 id,name 属性可以指定一个或者多个名称,各个名称之间用逗号或者分号隔开,第一个默认为标识名称,后面的多个自动成为这个 Bean
Bean 的 class属性
在 Spring 配置文件中 class 属性指明 Bean 的来源,也就是 Bean
Bean
在 Spring 中可以直接在配置文件中指定类的作用域, scope 标识 Bean
在 Spring2.0 之前 Bean 只有两种作用域,即 Singleton( 单例 ) 和 non-Singleton( 也称 prototype) , Spring2.0 以后,增加了 session 、 request 和 global session 三个专用于 Web 应用程序上下文的 Bean
singleton
当一个 Bean 的作用域设置为 Singleton ,那么 Spring IOC 容器中只存在一个共享的 Bean 实例,并且所有对 Bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean 的同一个实例。这个单一实例会被存储到单例缓存 (singleton cache) 中,并且所有针对该 bean
prototype
prototype 的作用域部署的 Bean ,每一个请求都会产生一个新的 Bean 实例,相当于一个 new 的操作,对于 prototype 作用域的 bean ,有一点非常重要,那就是 Spring 不能对一个 prototype 的整个生命周期复杂,容器在初始化、配置、装饰或者是装配完一个 prototype 实例后,将它交给客户端,随后就对该 prototype
request
request 表示针对每一个 HTTP 请求都会产生一个新的 Bean ,同时该 Bean 仅在当前 HTTP Request
session
session 作用域表示针对在一个 Http 请求都会产生一个新的 Bean ,同时该 Bean 仅在当前 Http session
global session
global session 作用域类似于标准的 HTTP Session
Bean
一个 Bean 从建立到销毁,会历经几个执行阶段,如果使用 BeanFactory 来生成、管理 Bean
Bean
由 BeanFactory 读取 Bean 的定义文件,并生成各个 Bean
属性注入
执行相关的 Bean
BeanNameAware 的 setBeanName()
如果 Bean 类有实现 org.springframework.beans.factory.BeanNameAware 接口,则执行它的 setBeanName()
BeanFactoryAware 的 setBeanFactory()
如果 Bean 类实现 org.springframework.beans.factory.BeanFactoryAware 接口,则执行它的 setBeanFactory()
BeanPostProcessors 的 processBeforeInitialization()
如果有任何的 org.springframework.beans.factory.config.BeanPostProcessor 实例与 Bean 实例相关联,则执行 BeanPostProcessor 实例的 processBeforeInitialization()
InitializingBean 的 afterPropertiesSet()
如果 Bean 类有实现 org.springframework.beans.factory.InitializingBean ,则执行它的 afterPropertiesSet()
Bean 定义文件中定义 init-method
Bean 定义文件使用 ”init-method”
BeanPostProcessors 的 processAfterInitialization()
如果有任何的 org.springframework.beans.factory.config.BeanPostProcessor 实例与 Bean 实例相关联,则执行 BeanPostProcessor 实例的 processAfterInitialization()
DisposableBean 的 destroy()
在容器关闭时,如果 Bean 类有实现 org.springframework.beans.factory.DisposableBean 接口,则执行它的 destroy()
Bean 定义文件中定义 destroy –method
在容器关闭时,可以在 Bean 定义文件使用 ” destroy –method ”
FactoryBean
Spring 中有两种类型的 Bean ,一种是普通的 Bean ,普通的 Bean 可以是用户定义的任何类;另一种是工厂 Bean ,即 FactoryBean 。工厂 Bean 与普通的 Bean 不同,其返回的对象不是指定类的一个实例,其返回的是该工厂 Bean 的 getObject 方法返回的对象。在 Spring 框架内部, AOP 相关的功能及事务处理中,很多方法使用到工厂 Bean 。
BeanPostProcessor
在 Bean 的依赖关系由 Spring 容器建立并设置以后,你还有机会定义一些 Bean 的修正动作来修正相关的属性,方法是让 Bean 类实现 org.springframework.beans.factory.config.BeanPostProcessor 接口,该接口与 Spring
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
postProcessBeforeInitialization 方法会在 Bean 类被初始化之前 ( 例如 InitializingBean 的 afterPropertiesSet() 方法或者自定义的 init 方法 ) 被执行,而 postProcessAfterInitialization() 方法会在 Bean