Spring中的BeanPostProcessor又称Spring的后置处理器,在Spring进行初始化之前和之后,会回调其中的两个方法。
public interface BeanPostProcessor {
//第一个参数表示当前的bean对象,第二个是bean的名字
//这个方法是在初始化前执行的
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//这个方法在初始化之后调用
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
接下来看看Spring中运用的BeanPostProcessor实例:
Spring大量运用了该接口为我们提供了一些应用,比如ApplicationContextAwareProcessor
这个类,该类的作用是我们使用的bean继承了该接口,就可以从该接口中获取到全局的ApplicationContext
,我们测试一下:
接口类:
@Service
public class UserService implements ApplicationContextAware {
ApplicationContext applicationContext;
public void printUser() {
User user = applicationContext.getBean(User.class);
System.out.println(user);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("设置了applicationContext.....");
this.applicationContext = applicationContext;
}
}
配置类:
@Configuration
@ComponentScan(value="com.cathetine.spring.blog")
public class UserConfiguration {
@Bean
public User user() {
User user = new User();
user.setUserName("Cat");
return user;
}
}
测试类:
public class TestUserService {
AnnotationConfigApplicationContext annotationConfigApplicationContext;
@Before
public void before() {
annotationConfigApplicationContext
= new AnnotationConfigApplicationContext(UserConfiguration.class);
}
@Test
public void test() {
UserService userService = annotationConfigApplicationContext.getBean(UserService.class);
userService.printUser();
}
}
说明获取到了IOC容器,那是怎么获取到的呢,我们看看ApplicationContextAwareProcessor
的源代码:
这个类继承了BeanPostProcessor
,再看看postProcessBeforeInitialization(final Object bean, String beanName)
方法实现:
原来这个方法会判断当前bean是否继承了ApplicationContextAware
,若继承了,会判断权限,然后往下走,我们看看invokeAwareInterfaces()
方法:
在这里继续判断类型,然后将applicationContext
设置进去。
其他的诸如EnvironmentAware
(设置环境)、ApplicationEventPublisherAware
(事件监听)、EmbeddedValueResolverAware
(字符串解析器)的设置都是一个道理。