在已有的注解类型下,获取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. python和ruby:一些需要注意的小区别。

    python和ruby的一些区别 基础区别 运算符号/和// ruby只有/符号.它根据操作的数字类型返回对应的结果.如果数字的类型是int,则返回整除结构,如果是float,则返回float类型的计 ...

  2. MFC Bitmap::FromBITMAPINFO返回空问题

    领导临时给了一个任务,项目上的一个问题,就是FromBITMAPINFO不成功,之前也没有弄过MFC的东西,但领导让干就干吧.咱也不知道怎么回事,咱也不敢问. 上来直接度娘,试过各种办法,都没与解决, ...

  3. 201871010101-陈来弟《面向对象程序设计(java)》第十七周学习总结

    实验十七  线程同步控制 实验时间 2018-12-10 第一部分:理论知识 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在 ...

  4. JAVA bean为何要实现序列化

    简而言之:序列化,就是为了在不同时间或不同平台的JVM之间共享实例对象.即序列化出于两个原因:①.用于持久化到磁盘上:②.用于作为数据流在网络上传输. 所谓的Serializable,就是java提供 ...

  5. Web.xml 定制URL

    直接上xml里的代码: <!--声明有哪些Servlet--> <servlet> <servlet-name>Book</servlet-name> ...

  6. java程序连接Liunx服务器并且执行命令

    JSch 介绍 JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2M ...

  7. python创建文件夹方法

    def mkdir(path): # 引入模块 import os # 去除首位空格 path = path.strip() # 去除尾部 \ 符号 path = path.rstrip(" ...

  8. CUDA-F-2-0-CUDA编程模型概述1

    Abstract: 本文介绍CUDA编程模型的简要结构,包括写一个简单的可执行的CUDA程序,一个正确的CUDA核函数,以及相应的调整设置内存,线程来正确的运行程序. Keywords: CUDA编程 ...

  9. Js模块化开发--seajs和gruntJs

    1.Seajs库 解决开发中的冲突依赖等问题,提供代码可维护性. SeaJS 是由玉伯开发的一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 JavaScript 模块和css ...

  10. Nginx配置中的log_format用法梳理

    nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件中日记配置( ...