zoukankan      html  css  js  c++  java
  • spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)

    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使用的一点心得。东西不多,希望对你有所帮助,欢迎留言交流。

  • 相关阅读:
    第十一章 前端开发-jQuery
    第十一章 前端开发-JavaScript
    js特效 15个小demo
    开发”小米商城官网首页”(静态页面)
    浅析BFC及其作用
    python mysql curros.executemany 批量添加
    第十一章 前端开发-css
    spark读取文件机制 源码剖析
    zookeeper从入门到放弃(转载学习)
    hbase架构和读写过程
  • 原文地址:https://www.cnblogs.com/MrSi/p/8021999.html
Copyright © 2011-2022 走看看