kusedexingfu 2021-05-22 18:17 采纳率: 25%
浏览 32

关于Spring生命周期的疑问

网上讲到的spring生命周期,基本都是用的这张图:

然而我通过代码实践,得到的结论却是不一样的:

@Component
public class SpringBean implements BeanNameAware,
                                    BeanFactoryAware,
                                    ApplicationContextAware,
                                    BeanPostProcessor, InitializingBean, DisposableBean {

    @Autowired
    private void setOwnBeanFactory(BeanFactory beanFactory) {
        System.out.println("填充属性");
    }

    public SpringBean() {
        System.out.println("实例化");
    }

    /**
     * BeanNameAware
     * @param name
     */
    @Override
    public void setBeanName(String name) {
        System.out.println("调用BeanNameAware.setBeanName():" + name);
    }

    /**
     * BeanFactoryAware
     * @param beanFactory
     * @throws BeansException
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("调用BeanFactoryAware.setBeanFactory()");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("调用ApplicationContextAware.setApplicationContext()");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization(),beanName:" + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用BeanPostProcessor.postProcessAfterInitialization(),beanName:" + beanName);
        return bean;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("调用InitializingBean.afterPropertiesSet()");
    }

    @PostConstruct
    private void init() {
        System.out.println("调用@PostConstruct自定义初始化方法");
    }

    @PreDestroy
    public void destory(){
        System.out.println("销毁:调用@PreDestroy自定义销毁方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("销毁:调用DisposableBean.destroy()");
    }
}

启动程序打印的结果却是:

 

实例化
填充属性
调用BeanNameAware.setBeanName():springBean
调用BeanFactoryAware.setBeanFactory()
调用ApplicationContextAware.setApplicationContext()
调用@PostConstruct自定义初始化方法
调用InitializingBean.afterPropertiesSet()

调用BeanPostProcessor.postProcessBeforeInitialization(),beanName:org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
调用BeanPostProcessor.postProcessAfterInitialization(),beanName:org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat

.......

 

可以看出,我实验的结果,从调用ApplicationContextAware.setApplicationContext() 之后和图片中是不一样的。

 

我用的版本是:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>

什么原因呢?

  • 写回答

2条回答 默认 最新

  • CSDN专家-sinJack 2021-05-22 18:22
    关注

    如果你实现没问题,那就是网上图有问题了。实践是唯一的真理。

    评论

报告相同问题?