springboot项目启动类
@SpringBootApplication
public class BeanLifeCycleApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(BeanLifeCycleApplication.class, args);context.close();}
}
定义一个LifeCycleBean,加上@Component注解,再编写一些方法,给这些方法加上Bean的生命周期过程中的注解
@Component
@Slf4j
public class LifeCycleBean {public LifeCycleBean() {log.debug("构造");}@Autowiredpublic void autowire(@Value("${JAVA_HOME}") String name) {log.debug("依赖注入:{}", name);}@PostConstructpublic void init() {log.debug("初始化");}@PreDestroypublic void destroy() {log.debug("销毁");}
}
编写自定义Bean的后处理器,需要实现InstantiationAwareBeanPostProcessor和DestructionAwareBeanPostProcessor接口,并加上@Component注解,对lifeCycleBean的生命周期过程进行扩展。
@Slf4j
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {@Override// 实例化前(即调用构造方法前)执行的方法public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if (beanName.equals("lifeCycleBean"))log.debug("<<<<<<<<<<< 实例化前执行,如@PreDestroy");// 返回null保持原有对象不变,返回不为null,会替换掉原有对象return null;}@Override// 实例化后执行的方法public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if (beanName.equals("lifeCycleBean")) {log.debug("<<<<<<<<<<< 实例化后执行,这里如果返回 false 会跳过依赖注入阶段");// return false;}return true;}@Override// 依赖注入阶段执行的方法public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if (beanName.equals("lifeCycleBean"))log.debug("<<<<<<<<<<< 依赖注入阶段执行,如@Autowired、@Value、@Resource");return pvs;}@Override// 销毁前执行的方法public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {if(beanName.equals("lifeCycleBean"))log.debug("<<<<<<<<<<<销毁之前执行");}@Override// 初始化之前执行的方法public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if(beanName.equals("lifeCycleBean"))log.debug("<<<<<<<<<<< 初始化之前执行,这里返回的对象会替换掉原本的bean,如 @PostConstruct、@ConfigurationProperties");return bean;}@Override// 初始化之后执行的方法public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if(beanName.equals("lifeCycleBean"))log.debug("<<<<<<<<<<< 初始化之后执行,这里返回的对象会替换掉原本的bean,如 代理增强");return bean;}
}
bean的除了四个阶段,每个阶段都可能会有后置增强功能。
模板方法设计模式
提高现有代码的扩展能力
public class TestMethodTemplatePattern {public static void main(String[] args) {MyBeanFactory beanFactory = new MyBeanFactory();beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Autowired"));beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Resource"));beanFactory.getBean();}static class MyBeanFactory {public Object getBean() {Object bean = new Object();System.out.println("构造:" + bean);System.out.println("依赖注入:" + bean);for (BeanPostProcessor processor : processors) {processor.inject(bean);}System.out.println("初始化:" + bean);return bean;}private List<BeanPostProcessor> processors = new ArrayList<>();public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {processors.add(beanPostProcessor);}}
不能确定的扩展抽象为接口interface BeanPostProcessor {void inject(Object bean);}
}