spring中ApplicationContextAware接口描述

项目中使用了大量的工厂类,采用了简单工厂模式


通过该工厂类可以获取指定的处理器bean,这些处理器bean我们是从spring容器中获取的,如何获取,是通过实现ApplicationContextAware接口完成的。

复制代码
@Component("handlerFactory")
public class HandlerFactory implements InitializingBean, ApplicationContextAware {

    private static final Map<String, HandlerIntf> HANDLER_MAP = new HashMap<String, HandlerIntf>();

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 初始化工厂
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        // 处理器1
        HANDLER_MAP.put(TaskTypeConstants.RECON_DATA, applicationContext.getBean("handle1", HandlerIntf.class));

        // 处理器2
        HANDLER_MAP.put(TaskTypeConstants.BUSINESS_DATA, applicationContext.getBean("handle2", HandlerIntf.class));
    }

    /**
     * 根据数据类型获取处理器
     *
     * @param dataType
     * @return
     */
    public SettleRequestHandlerIntf getHandler(String dataType) {
        HandlerIntf handler = HANDLER_MAP.get(dataType);
        if (null == handler) {
throw new AppException("0001", dataType + "不存在对应结算明细处理器"); } return handler; } }
复制代码


1. 实现setApplicationContext方法

通过以上代码,可以看到继承了ApplicationContextAware接口,就要实现setApplicationContext方法,而方法中applicationContext,是spring容器注入进来的,这样我们就可以通过applicationContext变量获取spring容器中存在的bean。

2. 在spring中注入当前HandlerFactory类
刚才我们提到spring容器会自动将applicationContext注入进来,那么spring容器怎么识别到当前HandlerFactory类的?原因就在于HandlerFactory类加了注解:

@Component("handlerFactory")

或这种方式注入:

<bean id="handlerFactory" class="com.xxx.HandlerFactory"/>

这样spring才能扫描到它,并将applicationContext注入。

posted on   阿泰555  阅读(202)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示