对于Spring容器管理的bean的获取方式 工具类

一、为什么需要ApplicationContextAware?

为了方便某个bean(如下文代码中的ApplicationContextRegister bean对象) 自行获取注入Spring容器的其他bean对象。

二、spring何时注入上下文?

1.通过源码跟踪了解到AbstractApplicationContext.class下的refresh()方法中的prepareBeanFactory这句跟Aware有关,同时,ApplicationContextAware是在spring初始化完bean后才注入上下文的

对于Spring容器管理的bean的获取方式 工具类_第1张图片

2.prepareBeanFactory方法中涉及到上图红圈圈这个类,此类中的方法postProcessBeforeInitialization调用了此类中的invokeAwareInterfaces方法:

对于Spring容器管理的bean的获取方式 工具类_第2张图片

对于Spring容器管理的bean的获取方式 工具类_第3张图片对于Spring容器管理的bean的获取方式 工具类_第4张图片

对于Spring容器管理的bean的获取方式 工具类_第5张图片

上图画圈圈的地方就是spring对实现ApplicationContextAware接口的类调用setApplicationContext进行上下文注入。

完整流程总结:

启动项目时,Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身了

--------------------------------------------

我们在ApplicationContextAware的实现类中,可以通过这个上下文环境对象得到Spring容器中的Bean。

推荐使用ApplicationContextAware的方式获取ApplicationContext,这样对非web及web环境都有很好的支持,

三、Demo代码

如下:

@Component
@Lazy (false)
public class ApplicationContextRegister implements ApplicationContextAware {
    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationContextRegister.class);
    private static ApplicationContext APPLICATION_CONTEXT;

    /**
     * 设置spring上下文  *  * @param applicationContext spring上下文  * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        LOGGER.debug("ApplicationContext registed-->{}", applicationContext);
        APPLICATION_CONTEXT = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return APPLICATION_CONTEXT;
    }
    //获取Bean
    public static  T getBean(Class requiredType){
        assertContextInjected();
        return (T) getApplicationContext().getBean(requiredType);
    }
    @SuppressWarnings("unchecked")
    public static  T getBean(String name){
        assertContextInjected();
        return (T) getApplicationContext().getBean(name);
    }
    //判断application是否为空
    public static void assertContextInjected(){
        Validate.isTrue(APPLICATION_CONTEXT==null, "application未注入 ,请在        springContext.xml中注入SpringHolder!");
    }
}

四、使用方式

ApplicationContextRegister.getApplicationContext() .getBean("xxservice");就可以获取对应的service的Bean了

你可能感兴趣的:(对于Spring容器管理的bean的获取方式 工具类)