spring bean的生命周期的扩展接口

             在DefaultListableBeanFactory类的实例的抽象父类AbstractAutowireCapableBeanFactory的doCreateBean()和父类DefaultSingletonBeanRegistry的destroyBean()。

// InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(循环,结果bean为null 
//                跳出)
// bean不为null时,BeanPostProcessor.postProcessAfterInitialization()
resolveBeforeInstantiation()
doCreateBean()->{ 
        
        //实例化bean
        createBeanInstance()->{
             
             //factoryMethod创建对象
             instantiateUsingFactoryMethod(beanName, mbd, args)
             
             //SmartInstantiationAwareBeanPostProcessor类扩展接口
             SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
                    (beanClass, beanName)
       
             instantiateBean();//null参类实例化构造函数
              
        };
        
        // 解析并缓存注解信息
        MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
        
        //属性填充
        populateBean()->{
            // InstantiationAwareBeanPostProcessor类扩展接口
            //   执行postProcessAfterInstantiation(),结果为true直接返回
            InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
            
            // InstantiationAwareBeanPostProcessor类扩展接口
            //   执行postProcessProperties()方法,
            pvsToUse = InstantiationAwareBeanPostProcessor.postProcessProperties
            // pvsToUse== null 执行
            pvsToUse = InstantiationAwareBeanPostProcessor.postProcessPropertyValues
               ((PropertyValues)pvs, filteredPds, 
                                  bw.getWrappedInstance(), beanName);
            // pvsToUse== null退出循环

            
        }
        
        //初始化bean
        initializeBean()->{
            
            //依次执行接口 BeanNameAware.setBeanName()
            // BeanClassLoaderAware.setBeanClassLoader() beanFactory对象的加载器
            // BeanFactoryAware.setBeanFactory() beanFactory对象
            invokeAwareMethods();  
            
            // BeanPostProcessor.postProcessBeforeInitialization
            //    接口为null,退出循环
            //    1.ApplicationContextAwareProcessor类
            //      EnvironmentAware.setEnvironment()
            //      EmbeddedValueResolverAware.setEmbeddedValueResolverr()
            //      ResourceLoaderAware.setResourceLoader()
            //      ApplicationEventPublisherAware.setApplicationEventPublisher()
            //      MessageSourceAware.setMessageSource()
            //      ApplicationContextAware.setApplicationContext()
            //      ApplicationStartupAware.setApplicationStartup()
            //    2.CommonAnnotationBeanPostProcessor类
            //      PostConstruct与PreDestroy
            applyBeanPostProcessorsBeforeInitialization();
            
            invokeInitMethods()->{
                //  InitializingBean接口
                // (InitializingBean)bean).afterPropertiesSet();
                invokeCustomInitMethod();//xml指定bean的init-method
            };
            
            // BeanPostProcessor.postProcessAfterInitialization
            //    接口为null,退出循环
            applyBeanPostProcessorsAfterInitialization();
        };
}
destroyBean()->{
        DisposableBeanAdapter(启动注入的bean实例).destroy()->{
            processor.postProcessBeforeDestruction(); //@PreDestroy()
            ((DisposableBean)this.bean).destroy(); //DisposableBean接口 
            invokeCustomDestroyMethod();//xml指定bean的destroy-method
        };
}


beanFactory.preInstantiateSingletons()->{
    // SmartInitializingSingleton.afterSingletonsInstantiated()
    smartSingleton.afterSingletonsInstantiated();
}

1. BeanNameAware接口。设置bean的name。

public interface BeanNameAware extends Aware {
    //DefaultListableBeanFactory类的实例的抽象父类AbstractAutowireCapableBeanFactory的
    //initializeBean()方法,在该方法中调用该类的invokeAwareMethods方法判断该bean是否实现了
    //BeanNameAware(BeanClassLoaderAware,BeanFactoryAware)接口,如果实现了该方法,则调用        
    //setBeanName()方法
    void setBeanName(String var1);//大多数类实现该接口,为了初始化该类的私有变量name(给bean设置name)
}

2.InitializingBean该接口。在bean的所有属性初始化后被调用。

public interface InitializingBean {
    //DefaultListableBeanFactory类的实例的抽象父类AbstractAutowireCapableBeanFactory的
    //initializeBean()方法,在该方法中调用该类的invokeInitMethods方法判断该bean是否实现了
    //InitializingBean接口,如果实现了该方法,则调用afterPropertiesSet()方法   
    void afterPropertiesSet() throws Exception;//大多数类实现该接口,1,校验类的属性是否为空,
                       //如果为空,则抛出异常或设置默认值。2.afterPropertiesSet()方法中调用                    
                       //protected initXXXBean(),让子类重写。
}

3. beanPostProcessor接口,增强处理器,调用初始化方法前后添加自己的逻辑。

public interface BeanPostProcessor {
    //DefaultListableBeanFactory类的实例的抽象父类AbstractAutowireCapableBeanFactory的
    //initializeBean()方法,接着applyBeanPostProcessorsBeforeInitialization()方法中循环
    //所有实现该接口的类,调用其重写的postProcessBeforeInitialization()方法
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Nullable
    //DefaultListableBeanFactory类的实例的抽象父类AbstractAutowireCapableBeanFactory的
    //initializeBean()方法,接着applyBeanPostProcessorsAfterInitialization()方法中循环
    //所有实现该接口的类,调用其重写的postProcessAfterInitialization()方法
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

4.@PostConstruct  在构造方法之后,实例化之前。

@PostConstruct注解标识的方法。
CommonAnnotationBeanPostProcessor类执行postProcessBeforeInitialization()方法完成的。

 @PreDestroy注解。对象销毁时,调用的方法       

@PreDestroy注解标识的方法。
CommonAnnotationBeanPostProcessor类执行postProcessBeforeDestruction()方法完成的。

 DisposableBean接口。 对象销毁时,调用的方法

//实现DisposableBean接口调用destroy()方法
((DisposableBean)this.bean).destroy()

           5.ApplicationContextAware接口,为了拿到AnnotationConfigServletWebServerApplicationContext实例对象。

ApplicationContextAwareProcessor类
调用postProcessBeforeInitialization()->{
    //依次判断bean是否实现Aware接口 EnvironmentAware->EmbeddedValueResolverAware->        
    //   ResourceLoaderAware->ApplicationEventPublisherAware->MessageSourceAware->
    //   ApplicationContextAware  调用相应方法
    ((ApplicationContextAware)bean).setApplicationContext();
}

6.FactoryBean接口,主要实现getObject()方法和getObjectType()方法.。对于Ioc管理的FactoryBean对象,springboot将其本身对象放在singletonFactories,需要用getbean("&"+name),而getObject()的对象放在factoryBeanObjectCache中。

// 用例为:SqlSessionFactoryBean类,该类主要生成SqlSessionFactory对象
//  SqlSessionFactoryBean类中的属性,主要是为了储存构建SqlSessionFactory的信息
// 获取MapperFactoryBean对象流程,getObject()->MapperProxyFactory中得到代理对象()
//    h=MapperProxy.class
doGetBean()—>{
    // 1. 先从一级缓存获取对象,返回。如果为null,则
    // 2. 为null且在singletonsCurrentlyInCreation中判断beanName是否在当前创建中,为false返回 
    //    null,如果为ture,则
    // 3. 从二级缓存获取对象,为null,则
    // 4. 从三级缓存获取对象,不为null返回同时删除在三级缓存的该对象,把对象放入二级缓存  
    object =getSingleton(String beanName, boolean true);

    //第一次object肯定得不到MapperFactoryBean对象
    // 1.从一级缓存中获取对象,为null时
    // 2.在singletonsCurrentlyInCreation添加beanName,and,newSingleton = false;
    // 3.调用createBean()方法创建bean,and,newSingleton = true;
    // 4.singletonsCurrentlyInCreation移除(beanName)
    // 5.将bean添加到一级缓存,移除二、三级缓存。
    sharedInstance = this.getSingleton(beanName, () -> {
                        try {
                            return this.createBean(beanName, mbd, args);
                        } catch (BeansException var5) {
                            this.destroySingleton(beanName);
                            throw var5;
                        }
                    });
    getObjectForBeanInstance()->{
        //如果为factoryBean
        // 1.factoryBeanObjectCache获取bean,如果为null,则
        // 2. doGetObjectFromFactoryBean方法中 object = factory.getObject();
        // 3.factoryBeanObjectCache添加bean
    }
}

7.SmartInitializingSingleton 接口 在所有beans都创建好后的回调接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值