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

來源:互聯網
上載者:User

標籤: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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.