Bean后处理器
常见的Bean后处理器有两种,它主要用来对Bean的注入进行一些拓展解析,比如@Autoweired注解或者@Resource注解。
1.准备Bean
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;@Autowiredpublic void setBean2(Bean2 bean2){log.info("Autowired生效 :{}",bean2);this.bean2 = bean2;}private Bean3 bean3;@Resourcepublic void setBean3(Bean3 bean3){log.info("@Resource生效 :{}",bean3);this.bean3 = bean3;}private String home;@Autowiredpublic void setHome(@Value("${JAVA_HOME}") String home){log.info("@Value生效: {}",home);}@PostConstructpublic void init(){log.info("@PostConstruct 生效");}@PreDestroypublic void destroy(){log.info("@PreDestroy 生效");}}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean2 {
}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean3 {
}
2.运行主类
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();//用原始方法注册beancontext.registerBean("bean1",Bean1.class);context.registerBean("bean2",Bean2.class);context.registerBean("bean3",Bean3.class);//初始化容器context.refresh();//销毁容器context.close();}}
注册我们提供的3个Bean,并且初始化并销毁容器。
结果:
可以发现我们在Bean1中依赖注入的一些类并没有生效。
3.AutowiredAnnotationBeanPostProcessor后处理器
首先需注入下面后处理器。
context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
结果:
上面已经解析了@Autowired注解,但需对@Value注解进一步处理。
context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
4.CommonAnnotationBeanPostProcessor后处理器
context.registerBean(CommonAnnotationBeanPostProcessor.class);
结果如下:
该后处理器主要用来解析@Resource注解,还可以解析@PostConstruct,@PreDestroy等注解。而且依赖注入按照一定的排序生效了,从结果来看是@Resource先生效。