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