Spring Bean学习

一、定义

bean的定义

  • Bean是一个被实例化组装、并被Spring容器所管理的对象,是由容器提供的配置元数据(如bean.xml)创建的。(下图是Bean与Spring容器的关系)

image

 

bean的三种元数据配置(bean的创建)

  1. 基于XML的配置
<beans>
    <bean name="" class=""></bean>
</beans>
  1. 基于注解的配置
@Component
public class MyBeanConfig {

    @Autowired
    private Country country;

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country);
    }

}
  1. 基于Java的配置(@Configuration实现自动依赖注入,且通过代理操作,而@Component则没有代理,且需要加上@Autowired,否则两个方法返回的是不同的实例)
@Configuration
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}

bean的作用域

(可通过Xml的scope属性及@Scope注解进行配置)

  • singleton
  • prototype
  • request
  • session
  • global-session

bean的生命周期

  • 转自: https://www.zhihu.com/question/38597960/answer/77600561 image

  • 1、Spring对Bean进行实例化(相当于程序中的new Xx(),反射实现

  • 2、Spring将值和Bean的引用注入进Bean对应的属性中(反射实现

  • 3、如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)

  • 4、如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)

  • 5、如果Bean实现了ApplicationContextAwaer接口,Spring容器将调用setApplicationContext(ApplicationContext ctx)方法,把应用上下文作为参数传入.(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory )

  • 6、如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法(作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)

  • 7、如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。

  • 8、如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法(作用与第六步的一样,只不过是在Bean初始化前执行的,而这个是在Bean初始化后执行的,时机不同 )

  • 9、经过以上的工作后,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁

  • 10、如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。

综合上面十个步骤,可以简化为:Bean实例的创建、Bean属性的注入、Bean相关Aware接口的实现,Bean实例调用前的初始化、Bean实例的调用、Bean实例销毁前的初始化、Bean实例的销毁