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使用的一点心得。东西不多,希望对你有所帮助,欢迎留言交流。
spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)的更多相关文章
- Spring在代码中获取properties文件属性
这里介绍两种在代码中获取properties文件属性的方法. 使用@Value注解获取properties文件属性: 1.因为在下面要用到Spring的<util />配置,所以,首先要在 ...
- spring mvc在Controller中获取ApplicationContext
spring mvc在Controller中获取ApplicationContext web.xml中进行正常的beans.xml和spring-mvc.xml的配置: 需要在beans.xml中进行 ...
- java 从spring容器中获取注入的bean对象
java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...
- spring里头各种获取ApplicationContext的方法
为啥写这个文章呢?spring各个版本不同,以及和系统框架套在一起不同,导致获取的方式不同,网络上各种版本,太乱了,写获取方式的人都不写这个获取方式是在本地还是在WEB,在那种应用服务器下,在spri ...
- 从Spring容器中获取Bean。ApplicationContextAware
引言:我们从几个方面有逻辑的讲述如何从Spring容器中获取Bean.(新手勿喷) 1.我们的目的是什么? 2.方法是什么(可变的细节)? 3.方法的原理是什么(不变的本质)? 1.我们的目的是什么? ...
- Spring MVC中获取当前项目的路径
Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--> <context-param> <param-name>web ...
- java代码中获取进程process id(转)
另一方面,线程ID=进程ID+内部线程对象ID并不成立, 参考: blog.csdn.net/heyetina/article/details/6633901 如何在java代码中获取进 ...
- Java代码中获取Json的key值
测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym ...
- Android在代码中获取应用签名
平时都是用AS敲命令获取签名信息...还没有在代码中获取过签名~ 也算是老编程了,没做过这个稍微有点尴尬...本着有好轮子就用的原则,网上找了几篇博客,这块内容已经很完善了,我也没什么可以优化的... ...
随机推荐
- Django将request对象传入模板配置
对于很多时候,需要从模板中获取很请求中很多内容,比如当前请求的url,当前的session变量中的某个值,这时候我们可以通过配置可将request对象传递进模板. django1.10版本: sett ...
- 使用 ServiceAnt 更好地解耦你的程序
今天要厚着脸皮给大家推荐一个自己做的通信中间件--ServiceAnt,目前已经在我们团队的两个产品线上投入了使用. ServiceAnt是什么 它最初的定位是ESB(企业服务总线),但目前还没有达到 ...
- list类型
list是一个链表结构,可以模拟栈,队列 lpush list中压入一个元素 模拟栈 lrange 取出list的中的元素(0 -1 表示从头取到尾) rpush list中压入一个元素 模 ...
- 2017-07-11(sync basename dirname )
sync 在内存中尚未被更新的数据,就会被写入硬盘中:在关机或者重启前,最好多执行几次! basename 获取文件名 dirname 获取目录名
- linux_samba服务安装
什么是samba服务? 用于Windows和linux系统之间实现共享文件的目的服务 如何配置其服务? Linux端: 搭建服务 1. 安装samba yum install -y samba 2. ...
- 【转】软件开发工具介绍之 6.Web开发工具
[本文转自http://www.cnblogs.com/dusonchen/archive/2011/02/09/1739087.html ] 1.EditPlus 无论是编写xhtml页面,还是cs ...
- yum 安装zabbix2.4 /3.2.4
yum 安装zabbix2.4 首先zabbix需要的环境是web环境,默认的是lamp或者lnmp,讲道理,要是使用tomcat也是可以的,不过实验没有成功 系统:centos6.8_x64 附yu ...
- linux命令读取文件中特定行
1.如果你只想看文件的前5行,可以使用head命令, 如: head -5 /etc/passwd 2.如果你想查看文件的后10行,可以使用tail命令, 如: tail -10 /etc/passw ...
- win7:你需要来自Administrators的权限才能对此文件进行修改的一个文件
win7:你需要来自Administrators的权限才能对此文件进行修改的一个文件 Posted on 2010-11-29 09:54 寒宵飞飞 阅读(36117) 评论(1) 编辑 收藏 新建一 ...
- 初识Python装饰器
python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...