1. 程式人生 > >springboot通過名稱獲取bean(applicationContext)

springboot通過名稱獲取bean(applicationContext)

IOC容器有beanFactory 和ApplicationContext.通常建議使用後者,因為它包含了前者的功能。Spring的核心是ApplicationContext.它負責管理 beans 的完整生命週期。我們可以從applicationContext裡通過bean名稱獲取安裝的bean.進行某種操作。不能直接使用applicationContext.而需要藉助applicationContextAware.具體方法如下:

@Component
public class ApplicationContextHelper implements ApplicationContextAware {
    private static 
ApplicationContext applicationContext; public ApplicationContextHelper() { }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHelper.applicationContext = applicationContext;
    }

    public static 
Object getBean(String beanName) { return applicationContext != null?applicationContext.getBean(beanName):null; } }

宣告一個

ApplicationContextHelper元件,名字隨意。它實現了ApplicationContextAware介面。並重寫
setApplicationContext方法。在該元件裡可以通過名字獲取某個bean.
使用:
@SpringBootApplication
public class Application {

   public static void 
main(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