在已有的注解类型下,获取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. 清除input输入框的历史记录

    当之前的input框输入了数据后,下次输入有历史记录问题的解决方法 <input id="vhcl_no"  type="text"  autocompl ...

  2. python 示例代码5

    示例5:用户输入和格式化输出2(用户输入demo1)

  3. loj2718 「NOI2018」归程[Kruskal重构树+最短路]

    关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...

  4. asp.net操纵Oracle存储过程

    在bloginfo数据库中,利用用户名 system 密码 scy251147 选择超级管理员登陆  创建如下存储过程:  1 /*存储过程*/ 2 create or replace procedu ...

  5. python面向对象基础(三)内置方法 __xx__

    __str__和__repr__,__format__ 改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ #_*_coding:utf-8_*_ forma ...

  6. 【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)

    1.C:\Users\Administrator>sqlplus sys/xxx@xxx as sysdba; 2.SQL> create directory dbbak4 as 'e:\ ...

  7. 使用SpringSession和Redis解决分布式Session共享问题

    SpringSession优势 遵循servlet规范,同样方式获取session,对应用代码无侵入且对于developers透明化 关键点在于做到透明和兼容 接口适配:仍然使用HttpServlet ...

  8. linux安装locust及遇到的坑

    安装locust很简单,简单的我以为pip install一下就好了,结果运行locust死活不行,后来的后来,,才搞清楚还要进行以下操作. 前提: 1.已安装Python3和pip3(或者都是2,版 ...

  9. sqlserver 查询 字段

    SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='MenuInfo' select * from sysobjects where ...

  10. composer.json文件解读

    composer.json文件内容 laravel { "name": "laravel/laravel", //name 表示包的名称,由作者名和项目名组成, ...