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

相关推荐
Mr_sun.几秒前
Day06——权限认证-项目集成
java
瑶山3 分钟前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy10 分钟前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_8187320612 分钟前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_9419820525 分钟前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
码字的字节40 分钟前
Spring Cloud服务注册与发现(一):手把手搭建Eureka Server,详解高可用配置
spring·spring cloud·eureka
大厂资深架构师43 分钟前
Spring Cloud Eureka在后端系统中的服务剔除策略
spring·spring cloud·ai·eureka
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
sino爱学习1 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端
风生u2 小时前
activiti7 详解
java