扩展点系列之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 大道至简 悟在天成 */@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);


购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287