Spring-BeanPostProcessor PostConstruct init InitializingBean 执行顺序

执行顺序探究

新建一个对象用于测试

java 复制代码
@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
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("====== Student afterPropertiesSet");
	}

	/**
	 * 初始化方法用于配置 bean inti
	 */
	public void init() {
		System.out.println("====== afterPropertiesSet init");
	}

	/**
	 * PostConstruct
	 */
	@PostConstruct
	public void post() {
		System.out.println("====== Student PostConstruct");
	}

}

新建一个TestBeanPostProcessor 实现 BeanPostProcessor

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

通过注解的 方式进行测试

java 复制代码
@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的方式

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>
java 复制代码
@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

相关推荐
Aision_3 小时前
从工具调用到 MCP、Skill完整学习记录
java·python·gpt·学习·langchain·prompt·agi
zc.z7 小时前
JAVA实现:纯PCM格式音频转换成BASE64
java·音视频·pcm
mask哥8 小时前
力扣算法java实现汇总整理(上)
java·算法·leetcode
Aaswk9 小时前
Java Lambda 表达式与流处理
java·开发语言·python
是宇写的啊9 小时前
Spring AOP
java·spring
万邦科技Lafite9 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
Mr_pyx10 小时前
Spring AI 入门教程:Java开发者的AI应用捷径
java·人工智能·spring
Zephyr_011 小时前
Leedcode算法题
java·算法
苍煜11 小时前
Java开发IO零基础吃透:BIO、NIO、同步异步、阻塞非阻塞
java·python·nio
折哥的程序人生 · 物流技术专研12 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试