在后端日常开发过程中,正确掌握Spring Bean的生命周期,对应用设计、代码编写调试、问题定位等都有非常积极的作用,然而,网上提供的资料大部分是从源码的角度进行分析的,虽然能够达到“知其然知其所以然”的效果,但是,对刚接触spring或从事Spring开发时间的显然不够友好。实际上通过一个Bean的创建过程,完全可以大体理顺Spring Bean的生命周期。具体如下:
MyInterface.java:
public interface MyInterface {
int sum(int a,int b);
}
MyInterfaceImpl.java:
public class MyInterfaceImpl implements MyInterface,FactoryBean, InitializingBean, DisposableBean, BeanFactoryAware, ApplicationContextAware, BeanNameAware {
@Override
public int sum(int a, int b) {
return a+b;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("myInterfaceImpl:InitializingBean.afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("myInterfaceImpl:DisposableBean.destroy");
}
@PostConstruct
public void init() {
System.out.println("myInterfaceImpl:@PostConstruct");
}
// 充当destroy method
// 销毁方法的注解方式 等同于destroy-method
@PreDestroy
public void destroy1() {
System.out.println("myInterfaceImpl:@PreDestroy");
}
@Override
public void setBeanName(String name) {
System.out.println("myInterfaceImpl:Aware-setBeanName");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("myInterfaceImpl:Aware-setApplicationContext");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("myInterfaceImpl:Aware-setBeanFactory");
}
@Override
public Object getObject() throws Exception {
System.out.println("myInterfaceImpl:FactoryBean");
return new MyInterfaceImpl();
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public Class<?> getObjectType() {
return MyInterfaceImpl.class;
}
}
MyInterfaceBeanDefinitionRegistryPostProcessor.java:
@Component
public class MyInterfaceBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("myInterfaceImpl:BeanDefinitionRegistryPostProcessor-postProcessBeanFactory");
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("myInterfaceImpl:BeanDefinitionRegistryPostProcessor-postProcessBeanDefinitionRegistry");
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.example.demo.bean.MyInterfaceImpl");
registry.registerBeanDefinition("myInterfaceImpl",beanDefinition);
}
}
MyInterfaceBeanFactoryPostProcessor.java:
@Component
public class MyInterfaceBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("myInterfaceImpl:BeanFactoryPostProcessor-postProcessBeanFactory");
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.example.demo.bean.MyInterfaceImpl");
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
defaultListableBeanFactory.registerBeanDefinition("myInterfaceImpl",beanDefinition);
}
}
MyInterfaceBeanPostProcessor.java
@Component
public class MyInterfaceBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":BeanPostProcessor-postProcessBeforeInitialization" );
}
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":BeanPostProcessor-postProcessAfterInitialization" );
return Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
(proxy, method, args) -> {
//输出开始时间
//System.out.println("方法:" + method.getName() + "-开始时间:" + LocalDateTime.now());
Object result = method.invoke(bean, args);
//输出结束时间
//System.out.println("方法:" + method.getName() + "-结束时间:" + LocalDateTime.now());
return result;
});
} else {
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
}
MyInterfaceInstantiationAwareBeanPostProcessor.java
@Component
public class MyInterfaceInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation" );
}
return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation" );
}
return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessProperties" );
}
return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
}
}
MyInterfaceMergedBeanDefinitionPostProcessor.java
@Component
public class MyInterfaceMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition" );
}
}
@Override
public void resetBeanDefinition(String beanName) {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":MergedBeanDefinitionPostProcessor-resetBeanDefinition" );
}
MergedBeanDefinitionPostProcessor.super.resetBeanDefinition(beanName);
}
}
MyInterfaceSmartInitializingSingleton.java
@Component
public class MyInterfaceSmartInitializingSingleton implements SmartInitializingSingleton {
@Override
public void afterSingletonsInstantiated() {
System.out.println("myInterfaceImpl:SmartInitializingSingleton");
}
}
MyInterfaceSmartInstantiationAwareBeanPostProcessor.java
@Component
public class MyInterfaceSmartInstantiationAwareBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {
@Override
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":SmartInstantiationAwareBeanPostProcessor-determineCandidateConstructors" );
}
return SmartInstantiationAwareBeanPostProcessor.super.determineCandidateConstructors(beanClass, beanName);
}
@Override
public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
if (beanName.equals("myInterfaceImpl")) {
System.out.println(beanName+":SmartInstantiationAwareBeanPostProcessor-getEarlyBeanReference" );
}
return SmartInstantiationAwareBeanPostProcessor.super.getEarlyBeanReference(bean, beanName);
}
}
编译运行,结果如下: