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

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

doCreateBean()->{ 
        
        //实例化bean
        createBeanInstance()->{
             instantiateBean();//类实例化构造函数  
        };
        
        //属性填充
        populateBean()
        
        //初始化bean
        initializeBean()->{
            
            //依次执行接口 BeanNameAware,BeanClassLoaderAware,BeanFactoryAware  
            invokeAwareMethods();  
    
            //@PostConstruct和ApplicationContextAware,EnvironmentAware等接口
            applyBeanPostProcessorsBeforeInitialization();
            
            invokeInitMethods()->{
                ((InitializingBean)bean).afterPropertiesSet();//InitializingBean接口
                invokeCustomInitMethod();//xml指定bean的init-method
            };
            
            applyBeanPostProcessorsAfterInitialization();
        };
}
destroyBean()->{
        DisposableBeanAdapter(启动注入的bean实例).destroy()->{
            processor.postProcessBeforeDestruction(); //@PreDestroy()
            ((DisposableBean)this.bean).destroy(); //DisposableBean接口 
            invokeCustomDestroyMethod();//xml指定bean的destroy-method
        };
}

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都创建好后的回调接口。

你可能感兴趣的:(java)