Spring Bean的概念

SpringBean

BeanSpring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean

Spring 中有两个最基本、最重要的包,即 org.springframework.beansorg.springframework.context ,在这两个包中,为了实现无侵入式的框架,代码中大量地使用了 Java 中的反射机制,通过动态调用来避免硬编码,为 Spring 反向控制提供了基础保证,在这两个包中,最重要的类时 BeanFactoryApplicationContextBeanFactory 提供一种先进的配置机制来管理任何种类的 BeanApplicationContext 是建立在 BeanFactory 之上的,并增加了其他功能,例如,国际化的支持、资源的访问和事件传播等。

Bean 的标识 (idname)

Id 属性具有唯一性,每一个 Bean 只能有一个对应的 id,name 属性可以指定一个或者多个名称,各个名称之间用逗号或者分号隔开,第一个默认为标识名称,后面的多个自动成为这个 Bean 的别名。

Beanclass属性

Spring 配置文件中 class 属性指明 Bean 的来源,也就是 Bean 的实际路径,它指向一个实体类。

Bean 的作用域

Spring 中可以直接在配置文件中指定类的作用域, scope 标识 Bean 的作用域。

Spring2.0 之前 Bean 只有两种作用域,即 Singleton( 单例 )non-Singleton( 也称 prototype)Spring2.0 以后,增加了 sessionrequestglobal 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 属性依赖注入

BeanNameAwaresetBeanName()

         如果 Bean 类有实现 org.springframework.beans.factory.BeanNameAware 接口,则执行它的 setBeanName() 方法。

      BeanFactoryAwaresetBeanFactory()

如果 Bean 类实现 org.springframework.beans.factory.BeanFactoryAware 接口,则执行它的 setBeanFactory() 方法。

BeanPostProcessorsprocessBeforeInitialization()

如果有任何的 org.springframework.beans.factory.config.BeanPostProcessor 实例与 Bean 实例相关联,则执行 BeanPostProcessor 实例的 processBeforeInitialization()

InitializingBeanafterPropertiesSet()

如果 Bean 类有实现 org.springframework.beans.factory.InitializingBean ,则执行它的 afterPropertiesSet() 方法。

Bean 定义文件中定义 init-method

       可以在 Bean 定义文件使用 ”init-method” 属性设置方法名称。

       BeanPostProcessorsprocessAfterInitialization()

如果有任何的 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 不同,其返回的对象不是指定类的一个实例,其返回的是该工厂 BeangetObject 方法返回的对象。在 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 类被初始化之前 ( 例如 InitializingBeanafterPropertiesSet() 方法或者自定义的 init 方法 ) 被执行,而 postProcessAfterInitialization() 方法会在 Bean 类被初始化之后立即被执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值