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