ApplicationContextAware

学习完整课程请移步 互联网 Java 全栈工程师

当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得 ApplicationContext 中的所有 bean。换句话说,就是这个类可以直接获取 Spring 配置文件中,所有有引用到的 Bean 对象。

package com.funtl.leeshop.commons.context;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContext implements ApplicationContextAware, DisposableBean {

    private static final Logger logger = LoggerFactory.getLogger(SpringContext.class);

    private static ApplicationContext applicationContext;

    /**
     * 获取存储在静态变量中的 ApplicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        assertContextInjected();
        return applicationContext;
    }

    /**
     * 从静态变量 applicationContext 中获取 Bean,自动转型成所赋值对象的类型
     * @param name
     * @param 
     * @return
     */
    public static  T getBean(String name) {
        assertContextInjected();
        return (T) applicationContext.getBean(name);
    }

    /**
     * 从静态变量 applicationContext 中获取 Bean,自动转型成所赋值对象的类型
     * @param clazz
     * @param 
     * @return
     */
    public static  T getBean(Class clazz) {
        assertContextInjected();
        return applicationContext.getBean(clazz);
    }

    /**
     * 实现 DisposableBean 接口,在 Context 关闭时清理静态变量
     * @throws Exception
     */
    public void destroy() throws Exception {
        logger.debug("清除 SpringContext 中的 ApplicationContext: {}", applicationContext);
        applicationContext = null;
    }

    /**
     * 实现 ApplicationContextAware 接口,注入 Context 到静态变量中
     * @param applicationContext
     * @throws BeansException
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContext.applicationContext = applicationContext;
    }

    /**
     * 断言 Context 已经注入
     */
    private static void assertContextInjected() {
        Validate.validState(applicationContext != null, "applicationContext 属性未注入,请在 spring-context.xml 配置中定义 SpringContext");
    }
}

还需要在 spring-context.xml 配置文件中装配 ;

POM

需要在 pom.xml 中增加 org.apache.commons:commons-lang3 依赖


    org.apache.commons
    commons-lang3
    3.5

附:完整的 POM 文件

截止目前所学知识点,完整的 pom.xml 如下:



    4.0.0

    com.funtl
    leeshop
    1.0.0-SNAPSHOT
    war

    
        
        
            org.springframework
            spring-context
            4.3.17.RELEASE
        
        
            org.springframework
            spring-webmvc
            4.3.17.RELEASE
        
        

        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        
        

        
        
            org.slf4j
            slf4j-api
            1.7.25
        
        
            org.slf4j
            slf4j-log4j12
            1.7.25
        
        
            org.slf4j
            jcl-over-slf4j
            1.7.25
        
        
            org.slf4j
            jul-to-slf4j
            1.7.25
        
        
            log4j
            log4j
            1.2.17
        
        

        
        
            org.apache.commons
            commons-lang3
            3.5
        
        
    

你可能感兴趣的:(ApplicationContextAware)