• 扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean - 第433篇


    历史文章(累计400+篇文章)

    国内最全的Spring Boot系列之一

    国内最全的Spring Boot系列之二

    国内最全的Spring Boot系列之三

    国内最全的Spring Boot系列之四

    国内最全的Spring Boot系列之五》

    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);
    1. 我就是我,是颜色不一样的烟火。
    2. 我就是我,是与众不同的小苹果。

    à悟空学院: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

  • 相关阅读:
    Java基于J2EE的流浪动物收容与领养管理系统
    【C/C++】程序环境,探索程序的执行过程(习得无上内功《易筋经》的第一步)
    快速入门python机器学习
    前端瀑布流怎么布局
    数字文档管理对您的业务是否具有成本效益?
    eureka
    【PB续命03】借用Oracle的编码解码续命
    【启扬方案】基于RK3568核心板的激光打标机应用解决方案
    go 分支与循环
    【每日一读】Joint Unsupervised Learning of Deep Representations and Image Clusters
  • 原文地址:https://blog.csdn.net/linxingliang/article/details/125603852