Spring Bean的生命周期及其应用

一、什么是Bean?

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

Bean是一个由Spring IoC容器实例化、组装和管理的对象,bean就是一个实例。

 

二、Bean 的完整生命周期

Bean从创建-参与计算流程-销毁,spring通过IOC控制翻转进行操作,所以bean的整个生命周期都会暴露操作实例的方法,通过这些方法,可以更加灵活的操控每个实例对象。

下面展示了一个Bean的构造过程

深究Spring中Bean的生命周期

Bean 的生命周期

  1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化,配置文件中<bean>表示一个bean,也可以使用各种注解

  2. 然后对Bean在文件或注解中设置的属性等进行注入;

  3. 如果Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法,此处可以重新修改beanName;

  4. 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;

  5. 如果Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

  6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

  7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

  8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

记忆方法:数猪名 工厂上下 初始化四阶段 系统自我销毁 

三、生命周期中函数在开发中有什么用

我以前看到bean的生命周期的时候只是简单的记住它的顺序,感觉没什么用,真的是to yong to simple;

1.属性注入

<bean id="car1" class="com.demo.Car">
        <property name="name" value="宝马"></property>
        <property name="price" value="100000"></property>
</bean>

这样在car的类中有一个

public Car(String name,double price){
    this.name=name;
    this.price=price;
}

就可以实现一个设置好初始值得一个bean

2.BeanNameAware接口,有一个setBeanName方法

可以在类中新建一个String beanName变量,通过setBeanName进行复制,这样就可以知道这个bean的Name,

上面的id="car1" 也会通过这个setBeanName传入到实例中;

3.BeanFactoryAware接口,可以获得创建这个实例的工厂方法

BeanFactory  可以获得或者设置类
String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);

4.ApplicationContextAware  可以获得ApplicationContext 上下文,

applicationContext.getBeansOfType(RegistryConfig.class
applicationContext可以通过getBeansOfType获得所有已经继承RegistryConfig这个配置文件的实例Map,
Map的key是beanName value是对应的实例,这样这个类需要什么配置就能很好的确定

5.BeanPostProcessor接口的postProcessBeforeInitialization 、postProcessAfterInitialization

是在系统初始化和自定义初始化之前和之后的一些处理方法,针对所有Spring上下文中所有的bean,
可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,

然后对所有的bean进行一个初始化之前和之后的代理



6.InitializingBean接口,afterPropertiesSet是系统的初始化方法,此处可以对父类做一些基本的初始化
7.调用自己定义的初始化方法
<bean id="beanA"  class="classA"  init-method="anotherInit">

</bean>

init-method 配置的初始化方法

8.DisposableBean 系统销毁时调用的方法

9.自定义销毁方法:

<bean class="com.demo" init-method="start" destroy-method="destroy">
</bean>

destroy-method方法



原文地址:https://www.cnblogs.com/becoding/p/13416766.html