已解决
Spring底层原理学习笔记--第三讲--(bean生命周期与模板方法)
来自网友在路上 183883提问 提问时间:2023-11-07 22:46:42阅读次数: 83
最佳答案 问答题库838位专家为你答疑解惑
bean生命周期
A03Application.java
package com.lucifer.itheima.a03;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class A03Application {public static void main(String[] args) {//执行结果为// 2023-11-06 10:41:10.761 INFO 54360 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 构造// 2023-11-06 10:41:10.764 INFO 54360 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 依赖注入// 2023-11-06 10:41:10.765 INFO 54360 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 初始化// 2023-11-06 10:41:11.060 INFO 54360 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 销毁ConfigurableApplicationContext context = SpringApplication.run(A03Application.class);context.close();}
}
LifeCycleBean.java
package com.lucifer.itheima.a03;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Component
@Slf4j
public class LifeCycleBean {public LifeCycleBean(){log.info("构造");}@Autowiredpublic void autowire(@Value("${JAVA_HOME}") String home) {log.info("依赖注入:{}",home);}@PostConstructpublic void init() {log.info("初始化");}@PreDestroypublic void destroy(){log.info("销毁");}
}
MyBeanPostProcessor.java
package com.lucifer.itheima.a03;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;@Component
@Slf4j
//执行结果为
//2023-11-06 11:50:39.728 INFO 47300 --- [ main] c.l.itheima.a03.MyBeanPostProcessor : <<<<<<实例化之前执行,这里返回的对象会替换掉原来的bean
// 2023-11-06 11:50:39.730 INFO 47300 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 构造
// 2023-11-06 11:50:39.732 INFO 47300 --- [ main] c.l.itheima.a03.MyBeanPostProcessor : <<<<<<实例化之后,这里如果返回false会跳过依赖注入阶段
// 2023-11-06 11:50:39.732 INFO 47300 --- [ main] c.l.itheima.a03.MyBeanPostProcessor : <<<<<<初始化之前执行,这里返回的对象会替换掉原来的bean,如PostConstruct,@ConfigurationProperties
//2023-11-06 11:50:39.732 INFO 47300 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 初始化
// 2023-11-06 11:50:39.732 INFO 47300 --- [ main] c.l.itheima.a03.MyBeanPostProcessor : <<<<<<初始化之后执行,这里返回的对象会替换掉原来的bean,如代理增强
// 2023-11-06 11:50:40.034 INFO 47300 --- [ main] c.l.itheima.a03.MyBeanPostProcessor : <<<<<<销毁之前执行,如@PreDestroy
//2023-11-06 11:50:40.035 INFO 47300 --- [ main] com.lucifer.itheima.a03.LifeCycleBean : 销毁
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {@Overridepublic void postProcessBeforeDestruction(Object bean,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean"))log.info("<<<<<<销毁之前执行,如@PreDestroy");}@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean")){log.info("<<<<<<实例化之前执行,这里返回的对象会替换掉原来的bean");}// 返回null的话就不会替换掉原来的对象return null;}@Overridepublic boolean postProcessAfterInstantiation(Object bean,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean")) {log.info("<<<<<<实例化之后,这里如果返回false会跳过依赖注入阶段");return false;}return true;}@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs,Object bean,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean")) {log.info("<<<<<<依赖注入阶段执行,如@Autowired,@Value,@Resource");}return pvs;}@Overridepublic Object postProcessBeforeInitialization(Object bean,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean")) {log.info("<<<<<<初始化之前执行,这里返回的对象会替换掉原来的bean,如PostConstruct,@ConfigurationProperties");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean,String beanName) throws BeansException{if (beanName.equals("lifeCycleBean")){log.info("<<<<<<初始化之后执行,这里返回的对象会替换掉原来的bean,如代理增强");}return bean;}
}
模板方法
package com.lucifer.itheima.a03;import java.util.ArrayList;
import java.util.List;public class TestMethodTemplate {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();}// 模板方法 Template Method Patternstatic class MyBeanFactory {public Object getBean() {Object bean = new Object();System.out.println("构造 "+bean);System.out.println("依赖注入 "+ bean); // @Autowired,@Resourcefor (BeanPostProcessor processor : processors) {processor.inject(bean);}System.out.println("初始化 "+bean);return bean;}private List<BeanPostProcessor> processors = new ArrayList<>();public void addBeanPostProcessor(BeanPostProcessor processor) {processors.add(processor);}}static interface BeanPostProcessor{public void inject(Object bean); //对依赖注入阶段的扩展}}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Spring底层原理学习笔记--第三讲--(bean生命周期与模板方法)":http://eshow365.cn/6-34812-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!