扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean - 第433篇
导读
ApplicationContextAwareProcessor是一个bean后置处理器,用来处理用到的感知接口(实现spring中aware结尾的接口)
一、ApplicationContextAwareProcessor概述
1.1是什么?
org.springframework.context.support.ApplicationContextAwareProcessor
该类本身并没有扩展点,但是该类内部却有6个扩展点可供实现 ,这些类触发的时机在bean实例化之后,初始化之前。
1.2 6个扩展点
从上面图片中可以看到,该类用于执行各种驱动接口,在bean实例化之后,属性填充之后,通过执行以上红框标出的扩展接口,来获取对应容器的变量。所以这里应该来说是有6个扩展点:
(1)EnvironmentAware:用于获取Enviroment的一个扩展类,这个变量非常有用, 可以获得系统内的所有参数。当然个人认为这个Aware没必要去扩展,因为Spring内部都可以通过注入的方式来直接获得。
(2)EmbeddedValueResolverAware:用于获取StringValueResolver的一个扩展类, StringValueResolver用于获取基于String类型的properties的变量,一般我们都用@Value的方式去获取,如果实现了这个Aware接口,把StringValueResolver缓存起来,通过这个类去获取String类型的变量,效果是一样的。
(3)ResourceLoaderAware:用于获取ResourceLoader的一个扩展类,ResourceLoader可以用于获取classpath内所有的资源对象,可以扩展此类来拿到ResourceLoader对象。
(4)ApplicationEventPublisherAware:用于获取ApplicationEventPublisher的一个扩展类,ApplicationEventPublisher可以用来发布事件,结合ApplicationListener来共同使用,下文在介绍ApplicationListener时会详细提到。这个对象也可以通过spring注入的方式来获得。
(5)MessageSourceAware:用于获取MessageSource的一个扩展类,MessageSource主要用来做国际化。
(6)ApplicationContextAware:用来获取ApplicationContext的一个扩展类,ApplicationContext应该是很多人非常熟悉的一个类了,就是spring上下文管理器,可以手动的获取任何在spring上下文注册的bean,我们经常扩展这个接口来缓存spring上下文,包装成静态方法。同时ApplicationContext也实现了BeanFactory,MessageSource,ApplicationEventPublisher等接口,也可以用来做相关接口的事情。
二、EnvironmentAware扩展实现方式
接下来看下EnvironmentAware的扩展方式,实现起来很简单:
package com.kfit.config;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
/**
*
*
* @author 悟纤「公众号SpringBoot」
* @date 2022-07-04
* @slogan 大道至简 悟在天成
*/
@Component
public class MyEnvironmentAware implements EnvironmentAware {
@Override
public void setEnvironment(Environment environment) {
System.out.println("MyEnvironmentAware.setEnvironment");
System.out.println("JAVA_HOME--> "+environment.getProperty("JAVA_HOME"));
//取不到为null
// String bb = environment.getProperty("user.name");
// Integer aa = environment.getProperty("user.age", Integer.class);
// //获取是否使用profile的
// boolean dev = environment.acceptsProfiles(Profiles.of("dev"));
// //取不到就抛出异常
// String bb1 = environment.getRequiredProperty("user.name");
// //其他自行扩展
}
}
执行结果:
另外Environment也可以通过注解直接注入使用:
@Autowired
private Environment environment;
三、ApplicationContextAware扩展实现方式
ApplicationContextAware最常用的使用就是编写静态方法工具类,这样在普通的类中(未在类上添加了@Service、@Controller等注解的类)就同样可以获取到Spring IOC容器中的对象。
package com.kfit.config;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
*
*
* @author 悟纤「公众号SpringBoot」
* @date 2022-07-04
* @slogan 大道至简 悟在天成
*/
@Component
public class ApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
/**
* 通过bean name获取到bean对象
* @param name
* @param <T>
* @return
*/
public static <T> T getBean(String name) {
return (T) ctx.getBean(name);
}
/**
* 通过bean 的class获取到bean对象.
* @param requiredType
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> requiredType) {
return ctx.getBean(requiredType);
}
}
使用:
DemoService demoService = ApplicationContextHelper.getBean(DemoService.class);
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287