常见的Bean后处理器有两种,它主要用来对Bean的注入进行一些拓展解析,比如@Autoweired注解或者@Resource注解。
1.准备Bean
java
package com.example.demo2.b02;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/2 23:06
*/
public class Bean1 {
private static final Logger log = LoggerFactory.getLogger(Bean1.class);
private Bean2 bean2;
@Autowired
public void setBean2(Bean2 bean2){
log.info("Autowired生效 :{}",bean2);
this.bean2 = bean2;
}
private Bean3 bean3;
@Resource
public void setBean3(Bean3 bean3){
log.info("@Resource生效 :{}",bean3);
this.bean3 = bean3;
}
private String home;
@Autowired
public void setHome(@Value("${JAVA_HOME}") String home){
log.info("@Value生效: {}",home);
}
@PostConstruct
public void init(){
log.info("@PostConstruct 生效");
}
@PreDestroy
public void destroy(){
log.info("@PreDestroy 生效");
}
}
java
package com.example.demo2.b02;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/2 23:08
*/
public class Bean2 {
}
java
package com.example.demo2.b02;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/2 23:08
*/
public class Bean3 {
}
2.运行主类
java
package com.example.demo2.b02;
import org.springframework.context.support.GenericApplicationContext;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/2 23:03
*/
public class TestBeanPostProcessor {
public static void main(String[] args) {
//创建一个干净的容器
GenericApplicationContext context = new GenericApplicationContext();
//用原始方法注册bean
context.registerBean("bean1",Bean1.class);
context.registerBean("bean2",Bean2.class);
context.registerBean("bean3",Bean3.class);
//初始化容器
context.refresh();
//销毁容器
context.close();
}
}
注册我们提供的3个Bean,并且初始化并销毁容器。
结果:

可以发现我们在Bean1中依赖注入的一些类并没有生效。
3.AutowiredAnnotationBeanPostProcessor后处理器
首先需注入下面后处理器。
java
context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
结果:

上面已经解析了@Autowired注解,但需对@Value注解进一步处理。
java
context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());

4.CommonAnnotationBeanPostProcessor后处理器
java
context.registerBean(CommonAnnotationBeanPostProcessor.class);
结果如下:

该后处理器主要用来解析@Resource注解,还可以解析@PostConstruct,@PreDestroy等注解。而且依赖注入按照一定的排序生效了,从结果来看是@Resource先生效。