Spring BeanPostProcessor后置处理器使用

tech2025-01-11  10

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(字符串解析器)的设置都是一个道理。

最新回复(0)