本文共 1997 字,大约阅读时间需要 6 分钟。
InstantiationAwareBeanPostProcessor 是 Spring 的一个扩展点,他是 BeanPostProcessor 的子类,扩展了 BeanPostProcessor ,而外提供了 3 个方法:
1、Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
2、boolean postProcessAfterInstantiation(Object bean, String beanName) 3、PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)本篇我们来了解 postProcessAfterInstantiation 这个方法的作用,这个方法在 postProcessPropertyValues 之前执行,他有一个 boolean 值,主要是判断 bean是否需要填充属性,如果返回 true ,填充属性,如果返回 false,不填充属性。Spring 中默认实现了这个后置处理器的扩展点都是返回 true,所以才能正常填充属性。如果我们自定义了一个类,实现了InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 方法,返回 false,将不会给所有的 bean填充属性,但是,这个方法有两个参数,bean,beanName,使得我们可以针对性的判断哪个 Bean 需不需要填充属性。下面,我们通过代码更好理解。
配置类
@ComponentScan("com.javahly.spring59")@Configurationpublic class Appconfig {}
@Componentpublic class UserService { @Autowired IndexService indexService;}
@Componentpublic class IndexService { @Autowired UserService userService; @PostConstruct public void init(){ System.out.println("IndexService 的 userService 属性:"+userService); }}
@Componentpublic class OrderService { @Autowired UserService userService; @PostConstruct public void init(){ System.out.println("OrderService 的 userService 属性:"+userService); }}
@Componentpublic class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { if(beanName.endsWith("indexService")){ return false; } return true; }}
这里我们用 UserService,IndexService,OrderService 三个类,UserService,IndexService 注入了 OrderService属性,我们自定义了一个 MyInstantiationAwareBeanPostProcessor 实现了 InstantiationAwareBeanPostProcessor,重写了 postProcessAfterInstantiation 方法,如果是 indexService ,则返回 false,表示不再注入属性。我们且看执行结果。
IndexService 的 userService 属性:nullOrderService 的 userService 属性:com.javahly.spring59.service.UserService@3aa9e816
—— 完
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://uffsi.baihongyu.com/