Spring 深入理解之ApplicationContextAw

2020-01-20  本文已影响0人  尤力

一、概述

在某些类中我们经常需要通过ApplicationContext来获取需要的bean,但每一次使用new ClassPathXmlApplicationContext()都会重新装配文件并实例化上下文bean,这样肯定是很麻烦的,此时ApplicationContextAware接口的作用就体现出来了——spring会给实现此接口的类注入ApplicationContext对象。

ApplicationContextAware也是Spring提供的拓展性接口,可以让我们拿到 ApplicationContext实例


二、ApplicationContextAware

在spring项目中,类之间的关系是spring容器来管理的,但是一个项目中有些类不受spring容器管理,缺需要使用受spring管理的bean,这时候不能通过正常的方式注入bean,这时候spring给我们提供了ApplicationContextAware接口,我们可以编写一个工具类来实现ApplicationContextAware,通过工具类来获取我们需要的bean然后供不在spring容器中的类调用,具体代码如下:

public class ModuleManager {

    public static ModuleManagerinstance =null;

    private TskRunStateServiceImpltskRunStateService;

    static {

        instance =new ModuleManager();

    }

public void loadBaseConfig() {

    tskRunStateService = (TskRunStateServiceImpl) MyApplicationContext.Ctx.getBean("tskRunStateServiceImpl");

    tskRunStateService.getByState();

}

}

分析:比如ModuleManager不受Spring管理,那么要实例化它的依赖tskRunStateService,我们就需要借助Spring的拓展接口 ApplicationContextAware。Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。

@Component

public class MyApplicationContextimplements ApplicationContextAware {

    public static ApplicationContext Ctx;

    @Override

    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {

    System.out.println("applicationContext正在初始化,applicationContext:"+applicationContext);

    Ctx = applicationContext;

    Application.get().setContext(applicationContext);

}

}

备注:如果是在Spring管理的话直接可以通过注解注入来配置xml文件

@Configuration

@ImportResource(locations={"classpath:****.xml"})

public class ThreadPoolConfiguration {

}

上一篇 下一篇

猜你喜欢

热点阅读