springboot通過名稱獲取bean(applicationContext)
阿新 • • 發佈:2018-12-23
IOC容器有beanFactory 和ApplicationContext.通常建議使用後者,因為它包含了前者的功能。Spring的核心是ApplicationContext.它負責管理 beans 的完整生命週期。我們可以從applicationContext裡通過bean名稱獲取安裝的bean.進行某種操作。不能直接使用applicationContext.而需要藉助applicationContextAware.具體方法如下:
@Component public class ApplicationContextHelper implements ApplicationContextAware { private staticApplicationContext applicationContext; public ApplicationContextHelper() { }
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextHelper.applicationContext = applicationContext; } public staticObject getBean(String beanName) { return applicationContext != null?applicationContext.getBean(beanName):null; } }
宣告一個
ApplicationContextHelper元件,名字隨意。它實現了ApplicationContextAware介面。並重寫
setApplicationContext方法。在該元件裡可以通過名字獲取某個bean.
使用:
@SpringBootApplication public class Application { public static voidmain(String[] args) { System.setProperty("user.timezone","Asia/Shanghai"); TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); SpringApplication.run(Application.class, args); } @Bean(name="restTemplate") public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters() .add(0, new StringHttpMessageConverter( Charsets.UTF_8)); return restTemplate; } }
public class TestTask implements Callable<String> { private RestTemplate restTemplate = (RestTemplate) ApplicationContextHelper.getBean( "restTemplate" );
public doSomeThing(){
}
} 此外,不只可以通過名稱,還可以通過屬於某一類Class<T>,來獲取類,例如,獲取所有的requestHandler及其url對映,可以通過如下語句:
RequestMappingHandlerMapping handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
關於RequestMappingHandlerMapping類,請參考:http://www.cnblogs.com/leftthen/p/5208404.html