Spring Bean生命周期
1、实例化Instantiation
2、属性赋值Populate
3、初始化Initialization
4、销毁Destruction
AbstractAutowireCapableBeanFactory
创建Bean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
return exposedObject;
}
感知Aware Group1
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
感知Aware Group2
EnvironmentAware
EmbeddedValueResolverAware
ResouceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
测试代码:
@Slf4j
@Data
public class MyAware implements
BeanNameAware,
BeanClassLoaderAware,
BeanFactoryAware,
EnvironmentAware,
EmbeddedValueResolverAware,
ResourceLoaderAware,
ApplicationEventPublisherAware,
MessageSourceAware,
ApplicationContextAware,
InitializingBean {
private String name;
@Autowired
private MyBeanPostProcessor myBeanPostProcessor;
public MyAware() {
log.info("new MyAware()");
}
public void myInit() {
log.info("myInit");
}
public void myDestroy() {
log.info("myDestroy");
}
@Override
public void setBeanName(String name) {
log.info("BeanNameAware={}", name);
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
log.info("BeanClassLoaderAware={}", classLoader);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
log.info("BeanFactoryAware={}", beanFactory);
}
@Override
public void setEnvironment(Environment environment) {
log.info("EnvironmentAware={}", environment);
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
log.info("EmbeddedValueResolverAware={}", resolver);
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
log.info("ResourceLoaderAware={}", resourceLoader);
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
log.info("ApplicationEventPublisherAware={}", applicationEventPublisher);
}
@Override
public void setMessageSource(MessageSource messageSource) {
log.info("MessageSourceAware={}", messageSource);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
log.info("ApplicationContextAware={}", applicationContext);
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("InitializingBean=afterPropertiesSet()");
}
}
@Slf4j
public class MyBeanPostProcessor implements
InstantiationAwareBeanPostProcessor,
BeanPostProcessor,
DestructionAwareBeanPostProcessor,
DisposableBean{
public MyBeanPostProcessor() {
log.info("new MyBeanPostProcessor()");
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
log.info("postProcessBeforeInstantiation");
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
log.info("postProcessAfterInstantiation");
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
log.info("postProcessProperties");
return null;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
log.info("postProcessBeforeInitialization");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("postProcessAfterInitialization");
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
log.info("postProcessBeforeDestruction");
}
@Override
public boolean requiresDestruction(Object bean) {
log.info("requiresDestruction");
return true;
}
@Override
public void destroy() throws Exception {
log.info("DisposableBean=destroy");
}
}
@Configuration
@ComponentScan(basePackages = {"com.example.demo.bean"})
public class MainConfig {
@Bean
public MyBeanPostProcessor myBeanPostProcessor() {
return new MyBeanPostProcessor();
}
@Bean(initMethod = "myInit", destroyMethod = "myDestroy")
public MyAware myAware() {
return new MyAware();
}
}
简略化后的测试LOG
MyBeanPostProcessor - postProcessBeforeInstantiation
MyAware - new MyAware()
MyBeanPostProcessor - postProcessAfterInstantiation
MyAware - BeanNameAware=myAware
MyAware - BeanClassLoaderAware=sun.misc.Launcher$AppClassLoader
MyAware - BeanFactoryAware=DefaultListableBeanFactory
MyAware - EnvironmentAware=StandardEnvironment
MyAware - EmbeddedValueResolverAware=EmbeddedValueResolver
MyAware - ResourceLoaderAware=AnnotationConfigApplicationContext
MyAware - ApplicationEventPublisherAware=AnnotationConfigApplicationContext
MyAware - MessageSourceAware=AnnotationConfigApplicationContext
MyAware - ApplicationContextAware=AnnotationConfigApplicationContext
MyBeanPostProcessor - postProcessBeforeInitialization
MyAware - myInit
MyAware - InitializingBean=afterPropertiesSet()
MyBeanPostProcessor - postProcessAfterInitialization
MyBeanPostProcessor - requiresDestruction
MyBeanPostProcessor - postProcessBeforeDestruction
MyAware - myDestroy
MyBeanPostProcessor - DisposableBean=destroy