• 依赖注入的进阶:深度解析ApplicationContextAware


    1. ApplicationContextAware是什么

    ApplicationContextAware 是Spring框架中的一个接口,它允许Spring管理的Bean获取对应用程序上下文(ApplicationContext)的访问权限。应用程序上下文是Spring框架的核心容器,负责管理Bean的生命周期依赖注入以及提供各种服务。

    2.为了解决什么问题

    ApplicationContextAware 接口的存在解决了以下问题:

    非Spring管理的类可能是第三方库、框架、或由其他开发者编写的,它们没有经过Spring的依赖注入,因此无法直接访问或与Spring管理的Bean进行交互。

    3. 有哪些应用场景

    3.1. 访问其他Spring Bean

    public class MyApplicationContextAwareBean implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public void doSomethingWithApplicationContext() {
            SomeOtherBean someOtherBean = applicationContext.getBean(SomeOtherBean.class);
            someOtherBean.doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.2 访问应用程序配置

    您可以使用应用程序上下文来访问应用程序的配置属性,例如属性文件中的配置信息或通过Spring的属性占位符访问属性值。

    public class ConfigAccessBean implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public String getConfigValue(String propertyName) {
            return applicationContext.getEnvironment().getProperty(propertyName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.3 在非Spring托管的类中引入AOP切面

    public class LoggingAspect implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public void logMethodInvocation(JoinPoint joinPoint) {
            // Access application context for additional functionality
            Logger logger = applicationContext.getBean(Logger.class);
            logger.log("Method invoked: " + joinPoint.getSignature());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.4 动态注册Bean定义

    public class BeanRegistrar implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public void registerNewBean(String beanName, Class<?> beanClass) {
            DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
            beanFactory.registerSingleton(beanName, applicationContext.getAutowireCapableBeanFactory().createBean(beanClass));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.5 执行初始化和清理逻辑

    public class AppContextInitializer implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
            // Perform initialization logic
            initialize();
        }
    
        private void initialize() {
            // Perform initialization tasks specific to this application context
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.6 在异步任务中访问应用程序上下文

    public class AsyncTask implements ApplicationContextAware, Runnable {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        @Override
        public void run() {
            // Access the application context within the asynchronous task
            SomeBean someBean = applicationContext.getBean(SomeBean.class);
            someBean.doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.6 动态获取消息和国际化

    public class MessageProvider implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public String getMessage(String key, Locale locale) {
            return applicationContext.getMessage(key, null, locale);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.7 访问事件发布机制

    public class EventListener implements ApplicationContextAware, ApplicationListener<MyCustomEvent> {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        @Override
        public void onApplicationEvent(MyCustomEvent event) {
            // Handle the custom event
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    【疯壳·嵌入式平板开发教程1】手把手教你做平板电脑-Linux 引导过程
    webpack 自定义loader与插件
    RHCSA练习
    基于JavaSwing开发书店管理系统+论文 毕业设计 课程设计 大作业
    boost之字符串--lexical_cast
    【ARM Trace32(劳特巴赫) 使用介绍 4 - Trace32 Discovery 详细介绍】
    [附源码]计算机毕业设计JAVA闲置物品交易管理系统
    DML——数据库查询语言
    uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上
    【解包裹】基于GPSA和AIA实现相位提取附matlab代码
  • 原文地址:https://blog.csdn.net/Hi_alan/article/details/133829851