SpringContextHolder工具類

1.工具類用途?java

該工具類主要用於那些沒有納入spring框架管理的類卻要調用spring容器中的bean提供的工具類,在spring中要經過IOC依賴注入來取得對應的對象,可是該類經過實現ApplicationContextAware接口,以靜態變量保存Spring ApplicationContext, 可在任何代碼任何地方任什麼時候候中取出ApplicaitonContext.如此就不能說說org.springframework.context.ApplicationContextAware這個接口了spring


2.ApplicationContextAware接口做用?app

當一個類實現了這個接口(ApplicationContextAware)以後,這個類就能夠方便得到ApplicationContext中的全部bean。換句話說,就是這個類能夠直接獲取spring配置文件中,全部有引用到的bean對象。除了以上SpringContextHolder類以外,還有不須要屢次加載spring配置文件就能夠取得bean的類。框架


3.setApplicationContextAware( )什麼時候執行?ide

Spring容器會檢測容器中的全部Bean,若是發現某個Bean實現了ApplicationContextAware接口,Spring容器會在建立該Bean以後,自動調用該Bean的setApplicationContextAware()方法,調用該方法時,會將容器自己做爲參數傳給該方法——該方法中的實現部分將Spring傳入的參數(容器自己)賦給該類對象的applicationContext實例變量,所以接下來能夠經過該applicationContext實例變量來訪問容器自己。工具

/**
 * Spring的ApplicationContext的持有者,能夠用靜態方法的方式獲取spring容器中的bean
 *
 */
@Component
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        assertApplicationContext();
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName) {
        assertApplicationContext();
        return (T) applicationContext.getBean(beanName);
    }

    public static <T> T getBean(Class<T> requiredType) {
        assertApplicationContext();
        return applicationContext.getBean(requiredType);
    }

    private static void assertApplicationContext() {
        if (SpringContextHolder.applicationContext == null) {
            throw new RuntimeException("applicaitonContext屬性爲null,請檢查是否注入了SpringContextHolder!");
        }
    }
}

修改配置文件spring-context.xml,添加bean:ui

<bean id="springContextHolder" class="com.utils.SpringContextHolder" lazy-init="false"/>

項目中的使用,例如UserRoleService.java:
private  UserService userService= SpringContextHolder.getBean(UserService.class);spa


注意:code

1.若是啓動項目後報錯 "applicaitonContext屬性爲null,請檢查是否注入了SpringContextHolder!",由於SpringContextHolder中的applicationContext爲空,猜想是SpringContextHolder這個bean沒有在UserRole這個bean加載前進行加載,致使沒有加載完成,因此咱們須要在配置文件中首先加載SpringContextHolder。把<bean id="springContextHolder" class="com.utils.SpringContextHolder" lazy-init="false"/>放在配置文件的第一個加載位置,再啓動項目發現正常。
2.在使用該類靜態方法時必須保證spring加載順序正確, 也能夠經過在使用類上添加 @DependsOn(「springContextHolder」),確保在此以前 SpringContextHolder 類已加載!
 xml

 
 
posted @ 2023-07-21 16:25  甜菜波波  阅读(26)  评论(0编辑  收藏  举报