美文网首页
Spring Bean的生命周期

Spring Bean的生命周期

作者: 远去的桅杆_ | 来源:发表于2020-09-07 00:50 被阅读0次

    Spring Bean 的生命周期大致分为:Bean定义,Bean初始化,Bean的生存期,Bean的销毁四个部分。

    1. 资源定位:
      Spring 通过我们的配置 如@ComponentScan 定义扫描路径去找带有@Component的类,
      这个过程就是一个资源定位的过程。

    2. Bean定义:
      一旦找到了资源,他就开始解析,并将信息保存起来。注意此时还没有初始化Bean,也就没有Bean实例,它 有的仅仅是Bean的定义。然后将Bean定义发送到IOC容器中。
      此时依然只有定义。

    3. 初始化:
      经过上述步骤,spring 会继续完成Bean 实例化和依赖注入。
      如果不想让spring继续初始化,可在@ComponentScan中设置lazyInit =true(默认为false)

    4. 初始化实例
      spring 在完成依赖注入后,提供了一系列接口和配置完成Bean初始化过程

    Bean的生命周期

    演示代码如下:

    @Component
    public class Person implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
    
        private String name=null;
    
        public void changeName(String name) {
            this.name = name;
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("【" + this.getClass().getSimpleName() + "】 BeanFactoryAware 的setBeanFactory方法");
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("【" + this.getClass().getSimpleName() + "】 调用 beanFactoryAware 的 setBeanName ");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("【" + this.getClass().getSimpleName() + "】 DisposableBean的destroy 方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("【" + this.getClass().getSimpleName() + "】 调用 initializingBean的 afterPropertiesSet 方法");
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("【" + this.getClass().getSimpleName() + "】 调用ApplicationContextAware 的setApplicationContext");
        }
    
        @PostConstruct
        public void init() {
            System.out.println("【" + this.getClass().getSimpleName() + "】 注解PostConstruct定义的自定义初始化方法");
    
        }
    
        @PreDestroy
        public void destory1() {
            System.out.println("【" + this.getClass().getSimpleName() + "】注解@PreDestroy定义的自定义销毁方法");
        }
    
    }
    
    @Component
    public class BeanPostProcessorExample  implements BeanPostProcessor {
    
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
    
            log.info("BeanPostProcessor 调用 " + " postProcessBeforeinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
            log.info("BeanPostProcessor 调用 " + " postProcessAfterinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
            return bean;
        }
    }
    
    @SpringBootApplication
    public class LearnApplication {
    
        /*public static void main(String[] args) {
            SpringApplication.run(LearnApplication.class, args);
        }*/
    
        public static void main (String[] args) {
            AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
            Person person = ctx.getBean(Person.class);
            person.changeName("Jack");
            ctx.close();
        }
    }
    
    @Configuration
    @ComponentScan(value = "com.caril.*",lazyInit = true)
    public class AppConfig {
    }
    

    下面Spring的Bean初始化的调用的流程

    image.png image.png image.png image.png 20200907004258.png image.png image.png

    相关文章

      网友评论

          本文标题:Spring Bean的生命周期

          本文链接:https://www.haomeiwen.com/subject/fhahektx.html