標籤:dev equal out request common imm spring架構 今天 val
2017年度全網原創IT博主評選活動投票:http://www.itbang.me/goVote/234
學習spring架構時間不長,一點一滴都得親力親為。今天忽然覺得老是通過@Autowired自動裝載組件不太舒服,老是要到類下寫註解。於是考慮直接擷取ApplicationContext,調用getBean去擷取自己想要的Bean執行個體。網上查了資料,一開始錯了方向,通過載入xml的方式初始化ApplicationContext,真是可笑的過程,咱這也算明顯的瞎搞。下面講講我現在學到的方案,兩種:1、用@Autowired直接組裝ApplicationContext;2、用ApplicationListener監聽ContextRefreshedEvent事件,在上下文重新整理完畢時,儲存ApplicationContext到全域對象中。
一、用@Autowired直接組裝ApplicationContext。比較簡單,簡單的貼下代碼。
@Autowired ApplicationContext context; @RequestMapping(value = "/login2") public String login2(String name, Model model, HttpServletRequest request, HttpSession session) { context.getBean(RequestBean.class).printId();
二、用ApplicationListener監聽ContextRefreshedEvent事件。個人比較喜歡這種實現,一來不必老寫@Autowired註解,二來還能繼續使用spring自動管理組件。
簡單說明:ApplicationListener是一個應用事件觀察者,可以監聽ApplicationEvent的各種擴充類,這個很有意思,我們完全可以定義自己的事件,然後用ApplicationListener進行監聽。下面附上一點源碼
1、定義一個上下文管理工具(全域使用)
package simm.spring.common.utils;import org.springframework.context.ApplicationContext;/** * 上下文擷取工具類 * @author wh-simm * */public class ApplicationContextUtil { public static ApplicationContextUtil instance = new ApplicationContextUtil(); private ApplicationContext _context; private ApplicationContextUtil(){} public void init(ApplicationContext context){ _context = context; } public ApplicationContext getContext(){ return _context; } /** * 擷取Bean * @param requiredType * @return */ public <T> T getBean(Class<T> requiredType){ return _context.getBean(requiredType); }}
2、實現上下文初始化完成或重新整理的監聽方法,進行ApplicationContext的擷取與儲存
package simm.spring.web.events;import org.springframework.context.ApplicationListener;import org.springframework.context.event.ContextRefreshedEvent;import org.springframework.stereotype.Service;import simm.spring.common.utils.ApplicationContextUtil;@Servicepublic class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { // TODO Auto-generated method stub if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")){ System.out.println("避免spring-servlet.xml跟appicationContext.xml兩次載入"); } if(event.getApplicationContext().getParent()==null){ System.out.println("執行context上下文初始化"); ApplicationContextUtil.instance.init(event.getApplicationContext()); } }}
3、接下來展示新的調用方式。現在這個調用就再也不用考慮是否成功完成了@Autowired了,在業務代碼裡可以隨意使用。有木有覺得一絲舒爽!
ApplicationContextUtil.instance.getBean(RequestBean.class).printId();
這就是我對ApplicationContext使用的一點心得。東西不多,希望對你有所協助,歡迎留言交流。
spring 代碼中擷取ApplicationContext(@AutoWired,ApplicationListener)