当前位置: 首页 > news >正文

Spring-BeanPostProcessor PostConstruct init InitializingBean 执行顺序

执行顺序探究

新建一个对象用于测试

@Component
public class Student implements InitializingBean {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** InitializingBean 提供的在属性设置之后执行的方法** @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("====== Student afterPropertiesSet");}/*** 初始化方法用于配置 bean inti*/public void init() {System.out.println("====== afterPropertiesSet init");}/*** PostConstruct*/@PostConstructpublic void post() {System.out.println("====== Student PostConstruct");}}

新建一个TestBeanPostProcessor 实现 BeanPostProcessor

@Component
public class TestBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("======== Student postProcessAfterInitialization");return bean;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("=============Student postProcessBeforeInitialization");return bean;}
}

通过注解的 方式进行测试

@Test
public void test3() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.liyong.learn");
Student bean = (Student) context.getBean("student");
System.out.println(String.format("ben is name{%s} age is {%s}", bean.getName(), bean.getAge()));
}

得到的结果如下:
在这里插入图片描述
总结PostProcessBeforeInitialization -> PostConstruct -> InitializingBean -> PostProcessAfterInitialization
通过Bean.xml的方式

<bean id="student" class="com.liyong.learn.Student" init-method="init"><property name="name" value="english"></property><property name="age" value="18"></property>
</bean>
<bean id="testBeanPostProcessor" class="com.liyong.learn.TestBeanPostProcessor"></bean>
@Test
public void test () {
// 指定XML路径
String path = "beans.xml";
// 创建DefaultListableBeanFactory工厂,这也就是Spring的基本容器
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 创建BeanDefinition阅读器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
// 进行BeanDefinition注册流程
reader.loadBeanDefinitions(path);
beanFactory.addBeanPostProcessor((BeanPostProcessor) beanFactory.getBean("testBeanPostProcessor"));
// Bean实例创建流程
Student student = (Student) beanFactory.getBean("student");
System.out.println(String.format("bean attrs name {%s} age {%s}", student.getName(), student.getAge()));
}

执行结果如下:
在这里插入图片描述
总结PostProcessBeforeInitialization -> InitializingBean -> initMethod -> PostProcessAfterInitialization

http://www.lryc.cn/news/283571.html

相关文章:

  • 【算法】递归
  • DC-1靶机刷题记录
  • rust跟我学七:获取外网IP地址
  • 华为:交换机忘记console密码重置
  • 2024年甘肃省职业院校技能大赛信息安全管理与评估 样题三 模块一
  • Go 中 slice 的 In 功能实现探索
  • pyDAL一个python的ORM(终) pyDAL的一些性能优化
  • springboot log4j配置xml实例说明
  • VsCode重新安装需要配机的ESLint和 Prettier - Code formatter 配置
  • 录屏功能怎么打开?简单操作,一学就会!
  • 小程序显示兼容处理,home键处理
  • 【java八股文】之JVM基础篇
  • 2024美赛数学建模思路 - 案例:异常检测
  • 【EI会议征稿通知】2024年通信技术与软件工程国际学术会议 (CTSE 2024)
  • Js面试之作用域与闭包
  • Go 爬虫之 colly 从入门到不放弃指南
  • Ceph分布式存储(1)
  • 制造业工厂为什么要实施MES系统呢?
  • Python 一行命令部署http、ftp服务
  • DBA技术栈(三):MySQL 性能影响因素
  • SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动
  • web前端项目-贪吃蛇小游戏【附源码】
  • ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练
  • 代码随想录 Leetcode459. 重复的子字符串(KMP算法)
  • Rust之构建命令行程序(三):重构改进模块化和错误处理
  • 广和通AI解决方案“智”赋室外机器人迈向新天地!
  • C++I/O流——(4)格式化输入/输出(第二节)
  • 九、K8S-label和label Selector
  • 【.NET Core】 多线程之(Thread)详解
  • 苹果笔记本 macbook 在 office word 中使用 mathtype 的方法