• 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 方法
    执行自己在配置文件中定义的结束方法
  • 相关阅读:
    beanstalkd 安装和配置
    vm虚拟机用批处理启动和关闭
    Windows设置VMware开机自动启动,虚拟机也启动
    批处理脚本学习笔记1--vmware虚拟机启停控制
    Shell中uname命令查看系统内核、版本
    SHELL脚本里执行的东西需要多次回车确认,怎么实现自动回车确认?
    eclipse下搭建shell脚本编辑器--安装开发shell的eclipse插件shelled
    如何进行shell脚本正确性测试
    robot framework
    loadrunner参数化数据分配方法
  • 原文地址:https://www.cnblogs.com/zawier/p/8086560.html
Copyright © 2020-2023  润新知