**Spring Bean相关

什么是Spring Beans

Spring Beans是构成Spring应用核心的Java对象。这些对象由 IOC容器实例化、组装、管理。这些对象通过容器中配置的元数据创建,例如,使用XML文件中定义的创建。

在Spring中创建的beans都是单例的beans。在bean标签中有一个属性为”singleton”,如果设为true,该bean是单例的,如果设为false,该bean是原型bean。Singleton属性默认设置为true。因此,spring框架中所有的bean都默认为单例bean。

 

Spring中支持的Bean的作用域

  • singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。
  • prototype:一个bean可以定义多个实例。
  • request:每次HTTP请求都会创建一个新的Bean。该作用域仅适用于WebApplicationContext环境。
  • session:一个HTTP Session定义一个Bean。该作用域仅适用于WebApplicationContext环境。
  • globalSession:同一个全局HTTP Session定义一个Bean。该作用域同样仅适用于WebApplicationContext环境。

bean默认的scope属性是"singleton"。

 

Spring 框架中 Bean的声明周期

**Spring Bean相关

 

  • 1.首先容器启动后,会对scope为singleton且非懒加载的bean进行实例化,
  • 2.按照Bean定义信息配置信息,注入所有的属性,
  • 3.如果Bean实现了BeanNameAware接口,会回调该接口的setBeanName()方法,传入该Bean的id,此时该Bean就获得了自己在配置文件中的id,
  • 4.如果Bean实现了BeanFactoryAware接口,会回调该接口的setBeanFactory()方法,传入该Bean的BeanFactory,这样该Bean就获得了自己所在的BeanFactory,
  • 5.如果Bean实现了ApplicationContextAware接口,会回调该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext,
  • 6.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessBeforeInitialzation()方法,
  • 7.如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法,
  • 8.如果Bean配置了init-method方法,则会执行init-method配置的方法,
  • 9.如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessAfterInitialization()方法,
  • 10.经过流程9之后,就可以正式使用该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存一份该bean的实例,而对于scope为prototype的Bean,每次被调用都会new一个新的对象,期生命周期就交给调用方管理了,不再是Spring容器进行管理了
  • 11.容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法,
  • 12.如果Bean配置了destroy-method方法,则会执行destroy-method配置的方法,至此,整个Bean的生命周期结束

 

BeanFactory  和 ApplicationContext 比较

相同点:

两者都是通过 XML 配置文件加载 bean, ApplicationContext 比 BeanFactory 提供了更多的扩展。

不同点:

BeanFactory:延迟加载,如果某个Bean的某一属性没有注入,BeanFactory加载后,知道第一次使用时的 getBean方法才抛出异常。

ApplicationContext :不是延迟加载,在初始化自身的时候检验,有利于检查所有依赖是否注入。