http://412887952-qq-com.iteye.com/blog/2292388java
由於有這樣一類需求:app
普通的Java類(沒有在Spring容器中管理的類),想直接使用Spring容器管理的對象(好比@Service註解的服務對象等)。框架
Web系統下,@RestController、@Service、@Component標註的類,都是由Spring容器統一管理的,當使用的類不是由Spring容器管理時,在類的方法中要使用到Spring容器管理的對象,此時就要是在普通類中調用bean。ide
實際開發中遇到的實例:攔截器AccessInterceptor(沒有在Spring容器中管理)中想調用某@Service服務。ui
/** * * Description:普通類調用Spring bean對象。說明:此類須要放到App.java同包或者子包下才能被掃描,不然失效。 * */ @Component public class SpringContextUtil implements ApplicationContextAware{ private static ApplicationContext applicationContext = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringContextUtil.applicationContext == null){ SpringContextUtil.applicationContext = applicationContext; } System.out.println("---------------------------------------------------------------------"); System.out.println("---------------------------------------------------------------------"); System.out.println("---------------com.richfit.ruiche.util.SpringContextUtil---------------------------"); System.out.println("========ApplicationContext配置成功,在普通類能夠經過調用SpringUtils.getAppContext()獲取applicationContext對象,applicationContext="+SpringContextUtil.applicationContext+"========"); System.out.println("---------------------------------------------------------------------"); } //獲取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //經過name獲取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //經過class獲取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //經過name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
實現ApplicationContextAware接口的setApplicationContext方法,實例化 applicationContext 對象。spa
提供方法根據服務名、對象類型獲取服務實體。code
代碼以下:對象
String cacheName = "rolePermission"; RoleService roleService = (RoleService) SpringContextUtil.getApplicationContext().getBean("roleService");
思路很簡單,獲取applicationContext,而後根據服務名稱獲取服務對象。blog