• Spring Bean 的生命周期


    1、实例化类
    2、设置属性
    3、如果实现了 BeanNameAware 接口,则调用其 setBeanName() 方法
    4、如果实现了 BeanFactoryAware 接口,则调用其 setBeanFactory() 方法
    5、如果实现了 ApplicationContextAware 接口,则调用其 setApplicationContext() 方法
    6、如果实在或存在 BeanPostProcessor 接口的实现类,则调用这个实现类的 postProcessBeforeInitialization() 方法
    7、如果实现了 InitializingBean 接口,调用其 afterPropertiesSet() 方法
    8、如果配置了 initMethod,则调用配置的对应方法
    9、如果实在或存在 BeanPostProcessor 接口的实现类,则调用这个实现类的 postProcessAfterInitialization() 方法
    =====到此处后,就可以正常使用 Bean =====
    10、如果实现了 DisposableBean 接口,则调用其 destroy() 方法
    11、如果配置了 destroyMethod,则调用配置的对应方法

    上面的很难记住,我们可以把它再分为几个阶段来理解:

    一、实例化相关           实例化--->设置属性值

    二、声明                     声明Bean名称--->声明BeanFactory--->声明ApplicationContext  

    三、初始化                  InitializingBean 的初始化方法 ---> 配置文件中声明的初始化方法(这两个方法会被 BeanPostProcessor 中的方法环绕)

    四、 结束                    DisposableBean 的结束方法---> 配置文件中定义的结束方法

    下面写一段代码来验证一下:

    // 自定义的 Bean
    public
    class TestBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean{ private String name; public TestBean() { System.out.println("执行无参构造器"); } public TestBean(String name) { System.out.println("执行有参构造器"); this.name = name; } @Override public void afterPropertiesSet() throws Exception { System.out.println("执行 InitializingBean 接口的 afterPropertiesSet 方法进行初始化"); } @Override public void destroy() throws Exception { System.out.println("执行 DisposableBean 接口的 destroy 方法"); } @Override public void setBeanName(String name) { System.out.println("执行 BeanNameAware 接口的 setBeanName 方法,用来声明 Bean 名称"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("执行 BeanFactoryAware 接口的 setBeanFactory 方法,用来声明其所在的 BeanFactory"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("执行 ApplicationContextAware 接口的 setApplicationContext 方法,用来声明其所在的 ApplicationContext"); } public void myinit() { System.out.println("执行自己在配置文件中定义的初始化方法"); } public void mydestroy() { System.out.println("执行自己在配置文件中定义的结束方法"); } }
    // BeanPostProcessor
    public
    class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization : " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization : " + beanName); return bean; } }
    // 配置类
    @Configuration
    public class BeanConfig { @Bean(initMethod = "myinit", destroyMethod = "mydestroy") public TestBean testBean1() { return new TestBean("hello"); } @Bean public MyBeanPostProcessor myBeanPostProcessor() { return new MyBeanPostProcessor(); } }
    // 测试类
    public
    class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( BeanConfig.class); context.registerShutdownHook(); } }

    执行结果如下:

    执行有参构造器
    执行 BeanNameAware 接口的 setBeanName 方法,用来声明 Bean 名称
    执行 BeanFactoryAware 接口的 setBeanFactory 方法,用来声明其所在的 BeanFactory
    执行 ApplicationContextAware 接口的 setApplicationContext 方法,用来声明其所在的 ApplicationContext
    postProcessBeforeInitialization : testBean1
    执行 InitializingBean 接口的 afterPropertiesSet 方法进行初始化
    执行自己在配置文件中定义的初始化方法
    postProcessAfterInitialization : testBean1
    执行 DisposableBean 接口的 destroy 方法
    执行自己在配置文件中定义的结束方法
  • 相关阅读:
    Delphi操作Excel大全
    一名Delphi程序员的开发习惯
    七维互联(www.7wei.com)
    Android开发数据库三层应用-DataSnap
    如何破解excel宏的密码
    让Delphi的DataSnap发挥最大效率
    使用 TRegistry 类[1]: 显示各主键下的项
    ini 文件操作记要(1): 使用 TIniFile
    Delphi经验总结(1)
    Delphi经验总结(2)
  • 原文地址:https://www.cnblogs.com/zawier/p/8086560.html
Copyright © 2020-2023  润新知