在已有的注解类型下,获取WebApplicationContext的工具类

通过  WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContextEvent sce);可以获得spring的单例webContext,这种方法是非常方便的,

如果涉及到底层架构师的级别,架设一套高可定制行的架构,使用泛型管理所有的Bean、service等类型非常有效果

好了,回归正题

WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContextEvent sce);

参数的sce怎么拿到的呢?

可以通过ServletContextListener 接口实现拿到,而ServletContextListener 中的方法只有下边两个,一个项目启动初始化环境时调用,一个项目摧毁关闭时调用,

其中,都可以刚给我们传递一个servletcontextevent这个请求上下文事件对象,我们可利用它来初始化一个WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContextEvent sce);中的sce对象,

这样就齐活了。

public interface ServletContextListener
extends EventListener
{

public abstract void contextInitialized(ServletContextEvent servletcontextevent);

public abstract void contextDestroyed(ServletContextEvent servletcontextevent);
}

具体使用如下,工具类ServiceLocator

 package XXXX;

 import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.apache.log4j.Logger;
import org.hibernate.CacheMode;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.Advised;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.web.context.support.WebApplicationContextUtils; import xxx.BaseService;
import xxx.ContextLoaderListener; /**
* 获取Service
* @author xxx
* @time 2012-10-13 01:02:38
* @version 1.0
*/
public class ServiceLocator { private static final Logger _logger = Logger.getLogger(ServiceLocator.class); // 不允许实例化,全部使用static函数。
private ServiceLocator() {
} public static class Initializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
_logger.info("-加载Listener-:"+ServiceLocator.Initializer.class.getName());
// 设置Spring的应用上下文
APPLICATION_CONTEXT = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
//数据缓存加载
loadAllEntities();
}
public void contextDestroyed(ServletContextEvent sce) {
}
} private static ApplicationContext APPLICATION_CONTEXT; public static Object getService(String serviceId) {
return APPLICATION_CONTEXT.getBean(serviceId);
} public static <T> T getService(Class<T> serviceType) {
if(APPLICATION_CONTEXT==null) return null;
try{
if(serviceType.toString().startsWith("interface")){
return (T)APPLICATION_CONTEXT.getBean(serviceType);
}else{
//_logger.info("-不使用接口类获取bean将不能进入事务->" + serviceType.getName());
}
}catch (Exception e) {
_logger.error(e);
}
String[] beanNames = APPLICATION_CONTEXT.getBeanDefinitionNames();
for (int i = 0; i < beanNames.length; i++) {
if (beanNames[i].indexOf("Service") == -1 && beanNames[i].indexOf("service") == -1) {
continue;
}
T service = getService(beanNames[i], serviceType);
if(service!=null){
return service;
}
}
_logger.info("-找不到对应Service->" + serviceType.getName());
return null;
} @SuppressWarnings("unchecked")
public static <T> T getService(String serviceId, Class<T> serviceType) {
try{
if(serviceType.toString().startsWith("interface")){
return (T)APPLICATION_CONTEXT.getBean(serviceId, serviceType);
}else{
//_logger.info("-不使用接口类获取bean将不能进入事务->" + serviceType.getName());
}
}catch (Exception e) {
_logger.error(e);
}
Object obj = APPLICATION_CONTEXT.getBean(serviceId);
if (obj instanceof Advised) {
Advised a = (Advised) obj;
TargetSource source = a.getTargetSource();
try {
T service = (T)source.getTarget();
return service;
} catch (Exception e) {
//_logger.error("--", e);
}
}
return null;
} @SuppressWarnings("rawtypes")
public static BaseService getServiceByEntityClass(Class entityClass) {
return getServiceByEntityName(entityClass.getName());
} @SuppressWarnings("rawtypes")
public static BaseService getServiceByEntityName(String entityName) {
Map<String, BaseService> map = APPLICATION_CONTEXT.getBeansOfType(BaseService.class);
if(!map.isEmpty()){
Set<Entry<String, BaseService>> set = map.entrySet();
for (Entry<String, BaseService> entry : set) {
BaseService service = entry.getValue();
if (entityName.equals(service.getEntityName())) {
return service;
}
}
}
_logger.info("-找不到对应Service-或没有实现BaseService接口->" + entityName);
return null;
} /**
* 加载所有实体类到缓存中
* @author xxx
* @time: 2015年11月3日 18:27:19
* @version: V1.0
*/
private static void loadAllEntities(){
SessionFactory sessionFactory = (SessionFactory)APPLICATION_CONTEXT.getBean("sessionFactory");
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
List<Class<?>> entities = ContextLoaderListener.getEntityClassList();
session.setCacheMode(CacheMode.NORMAL);
for (int i = 0; i < entities.size(); i++) {
Class<?> clazz = entities.get(i);
_logger.info("========数据缓存加载=========>"+clazz.getName());
Criteria criteria = session.createCriteria(clazz);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setCacheable(true);
criteria.list();
}
}
}

Spring MVC模式下,获取WebApplicationContext的工具类 方法的更多相关文章

  1. Spring Mvc模式下Jquery Ajax 与后台交互操作

    1.基本代码 1)后台控制器基本代码 @Controller @RequestMapping("/user") public class UserController { @Aut ...

  2. 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表

    提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...

  3. Spring mvc 模式小结

    http://www.taobaotesting.com/blogs/2375 1.spring mvc简介 Spring MVC框架是一个MVC框架,通过实现Model-View-Controlle ...

  4. Spring MVC源码——Servlet WebApplicationContext

    上一篇笔记(Spring MVC源码——Root WebApplicationContext)中记录了下 Root WebApplicationContext 的初始化代码.这一篇来看 Servlet ...

  5. 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境

    前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...

  6. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  7. 卡卡游戏引擎之MVC模式下的事件处理

    前言 在前一篇文章 卡卡游戏引擎快速入门中提到了卡卡游戏引擎采用mvc的开发模式,这里相信介绍一下引擎在mvc模式下是如何做到低耦合的事件处理的. 在卡卡编辑器中选择一个节点,然后在左侧工具栏中切换到 ...

  8. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  9. Spring MVC源码——Root WebApplicationContext

    目录 Spring MVC源码--Root WebApplicationContext 上下文层次结构 Root WebApplicationContext 初始化和销毁 ContextLoaderL ...

随机推荐

  1. OpenGL相关文章

    OpenGL之glMatrixMode函数的用法 gluOrtho2D和glViewport的作用&窗口与显示的关系 glViewport函数用法 纹理映射

  2. 【u-boot】u-boot中initf_dm()函数执行流程(转)

    前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){    int ret;    ret = dm_init_and_scan(t ...

  3. 【GDKOI2018】总结

    前言 车祸现场... day1 T1:其实就是对于每个点的有用的时间点建一个点,然后连边,对于询问(x,y),从点(y,inf),往回走,能走到的最早的x的时间点就是答案. 比赛上用最后的一个多小时来 ...

  4. 【Python网络】HTTP

    HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...

  5. React-native 触摸事件

    http://www.360doc.com/content/16/0711/23/34978982_574835465.shtml

  6. ZOJ - 3591 NIM

    ZOJ - 3591NIM 题目大意:给你n,s,w和代码,能生成长度为n的序列,问异或和不为0的子序列有多少个? 这是个挂羊头卖狗肉的题,和NIM博弈的关系就是要异或和不为0,一开始以博弈甚至循环节 ...

  7. $message的问题

    项目中出现$message的问题: 拉取数据成功后 this.$message.success("数据拉取成功")点击拉取第一次不出现,但是代码执行了,后来多次点击就出现了 原因: ...

  8. [笔记]动态规划(dynamic programming)

    动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解.分治算法可能反复的求解某些公共子问题,从而使 ...

  9. hbase hbck

    Number of Tables: 7Number of live region servers: 3Number of dead region servers: 0Number of empty R ...

  10. QTableWidget懒加载(动态加载)实现

    在QTableWidget中加入一行行的数据,如果数据数量过多,滚动起来就会卡顿,插入数据时也会影响性能,为了解决这个问题,采用懒加载的方式,只在界面上显示10几条数据,填满界面.同时增加而外的竖直滚 ...