1. 程式人生 > >spring 代碼中獲取ApplicationContext(@AutoWired,ApplicationListener)

spring 代碼中獲取ApplicationContext(@AutoWired,ApplicationListener)

原創 dev 是否 {} 展示 text 成了 over del

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;

@Service
public 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)