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

相关推荐
TDengine (老段)几秒前
人力减 60%:时序数据库 TDengine 助力桂冠电力实现 AI 智能巡检
java·大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
yaoxin52112313 分钟前
263. Java 集合 - 遍历 List 时选用哪种方式?ArrayList vs LinkedList
java·开发语言·list
JH307315 分钟前
Redisson vs Jedis vs Lettuce
java·redis
骇客野人16 分钟前
java对象和JSON对象之间的转换关系
java·开发语言·json
红石榴花生油16 分钟前
Linux服务器权限与安全核心笔记
java·linux·前端
sumAll21 分钟前
拒绝黑盒!Spring @Scheduled 定时任务源码深度解析
java·后端·spring
Seven9721 分钟前
剑指offer-47、求1+2+3...+n
java
ZePingPingZe22 分钟前
Spring boot2.x-第05讲番外篇:常用端点说明
java·spring boot·后端
Macbethad23 分钟前
WPF 工业设备管理程序技术方案
java·大数据·hadoop