
历史文章(累计400+篇文章)
SpringBoot/Spring扩展点BeanDefinitionRegistryPostProcessor - 第427篇
SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor - 第428篇SpringBoot扩展点系列之InstantiationAwareBeanPostProcessor模拟AOP - 第429篇
一款利用人工智能生成模型来合成代码的工具Copilot - 第430篇
SpringBoot配置文件内容加密,实现敏感信息保护 - 第431篇
扩展点系列之SmartInstantiationAwareBeanPostProcessor确定执行哪一个构造方法 - 432篇
悟纤:紧急呼叫师傅。

师傅:徒儿,又怎么了,何事如此慌张?

悟纤:徒儿,在一个普通的Java类中想获取到Spring Bean对象,但是不知道怎么获取呢?
师傅:巧了,为师今天分享的这个知识,就能助你轻松搞定。

悟纤:师傅,你这不是料事如神吧,已经预料到徒儿最近会碰到这个问题了。
师傅:徒儿 ,你猜呢?
悟纤:师傅,别闹~,咱们快快开始吧。

导读
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 大道至简 悟在天成 */@Componentpublic 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也可以通过注解直接注入使用:
@Autowiredprivate 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 大道至简 悟在天成 */@Componentpublic 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);
- 我就是我,是颜色不一样的烟火。
- 我就是我,是与众不同的小苹果。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7