• 依赖注入的进阶:深度解析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
  • 相关阅读:
    匈牙利算法讲解
    bert-base-cased问题
    宿舍是我的第二个家
    NLP入门之——Word2Vec词向量Skip-Gram模型代码实现(Pytorch版)
    DevExpress Reporting中文教程 - 如何在macOS等系统中生成导出报表文档
    【老生谈算法】matlab实现卡尔曼滤波算法源码——卡尔曼滤波
    【论】Balancing bike sharing systems with constraint programming
    MySQL删库不跑路
    Verasity Tokenomics — 社区讨论总结与下一步计划
    一文搞懂Docker
  • 原文地址:https://blog.csdn.net/Hi_alan/article/details/133829851