Spring MVC模式下,获取WebApplicationContext的工具类 方法

在已有的注解类型下,获取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 

  1 package XXXX;
  2 
  3 import java.util.List;
  4 import java.util.Map;
  5 import java.util.Map.Entry;
  6 import java.util.Set;
  7 
  8 import javax.servlet.ServletContextEvent;
  9 import javax.servlet.ServletContextListener;
 10 
 11 import org.apache.log4j.Logger;
 12 import org.hibernate.CacheMode;
 13 import org.hibernate.Criteria;
 14 import org.hibernate.Session;
 15 import org.hibernate.SessionFactory;
 16 import org.springframework.aop.TargetSource;
 17 import org.springframework.aop.framework.Advised;
 18 import org.springframework.context.ApplicationContext;
 19 import org.springframework.orm.hibernate3.SessionFactoryUtils;
 20 import org.springframework.web.context.support.WebApplicationContextUtils;
 21 
 22 import xxx.BaseService;
 23 import xxx.ContextLoaderListener;
 24 
 25 /**
 26 * 获取Service
 27 * @author xxx
 28 * @time 2012-10-13 01:02:38
 29 * @version 1.0
 30 */
 31 public class ServiceLocator {
 32 
 33 private static final Logger _logger = Logger.getLogger(ServiceLocator.class);
 34 
 35 // 不允许实例化,全部使用static函数。
 36 private ServiceLocator() {
 37 }
 38 
 39 public static class Initializer implements ServletContextListener {
 40 public void contextInitialized(ServletContextEvent sce) {
 41 _logger.info("-加载Listener-:"+ServiceLocator.Initializer.class.getName());
 42 // 设置Spring的应用上下文
 43 APPLICATION_CONTEXT = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
 44 //数据缓存加载
 45 loadAllEntities();
 46 }
 47 public void contextDestroyed(ServletContextEvent sce) {
 48 }
 49 }
 50 
 51 private static ApplicationContext APPLICATION_CONTEXT;
 52 
 53 public static Object getService(String serviceId) {
 54 return APPLICATION_CONTEXT.getBean(serviceId);
 55 }
 56 
 57 public static <T> T getService(Class<T> serviceType) {
 58 if(APPLICATION_CONTEXT==null) return null;
 59 try{
 60 if(serviceType.toString().startsWith("interface")){
 61 return (T)APPLICATION_CONTEXT.getBean(serviceType);
 62 }else{
 63 //_logger.info("-不使用接口类获取bean将不能进入事务->" + serviceType.getName());
 64 }
 65 }catch (Exception e) {
 66 _logger.error(e);
 67 }
 68 String[] beanNames = APPLICATION_CONTEXT.getBeanDefinitionNames();
 69 for (int i = 0; i < beanNames.length; i++) {
 70 if (beanNames[i].indexOf("Service") == -1 && beanNames[i].indexOf("service") == -1) {
 71 continue;
 72 }
 73 T service = getService(beanNames[i], serviceType);
 74 if(service!=null){
 75 return service;
 76 }
 77 }
 78 _logger.info("-找不到对应Service->" + serviceType.getName());
 79 return null;
 80 }
 81 
 82 @SuppressWarnings("unchecked")
 83 public static <T> T getService(String serviceId, Class<T> serviceType) {
 84 try{
 85 if(serviceType.toString().startsWith("interface")){
 86 return (T)APPLICATION_CONTEXT.getBean(serviceId, serviceType);
 87 }else{
 88 //_logger.info("-不使用接口类获取bean将不能进入事务->" + serviceType.getName());
 89 }
 90 }catch (Exception e) {
 91 _logger.error(e);
 92 }
 93 Object obj = APPLICATION_CONTEXT.getBean(serviceId);
 94 if (obj instanceof Advised) {
 95 Advised a = (Advised) obj;
 96 TargetSource source = a.getTargetSource();
 97 try {
 98 T service = (T)source.getTarget();
 99 return service;
100 } catch (Exception e) {
101 //_logger.error("--", e);
102 }
103 }
104 return null;
105 }
106 
107 @SuppressWarnings("rawtypes")
108 public static BaseService getServiceByEntityClass(Class entityClass) {
109 return getServiceByEntityName(entityClass.getName());
110 }
111 
112 @SuppressWarnings("rawtypes")
113 public static BaseService getServiceByEntityName(String entityName) {
114 Map<String, BaseService> map = APPLICATION_CONTEXT.getBeansOfType(BaseService.class);
115 if(!map.isEmpty()){
116 Set<Entry<String, BaseService>> set = map.entrySet();
117 for (Entry<String, BaseService> entry : set) {
118 BaseService service = entry.getValue();
119 if (entityName.equals(service.getEntityName())) {
120 return service;
121 }
122 }
123 }
124 _logger.info("-找不到对应Service-或没有实现BaseService接口->" + entityName);
125 return null;
126 }
127 
128 /**
129 * 加载所有实体类到缓存中
130 * @author xxx
131 * @time: 2015年11月3日 18:27:19
132 * @version: V1.0
133 */
134 private static void loadAllEntities(){
135 SessionFactory sessionFactory = (SessionFactory)APPLICATION_CONTEXT.getBean("sessionFactory");
136 Session session = SessionFactoryUtils.getSession(sessionFactory, true);
137 List<Class<?>> entities = ContextLoaderListener.getEntityClassList();
138 session.setCacheMode(CacheMode.NORMAL);
139 for (int i = 0; i < entities.size(); i++) {
140 Class<?> clazz = entities.get(i);
141 _logger.info("========数据缓存加载=========>"+clazz.getName());
142 Criteria criteria = session.createCriteria(clazz);
143 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
144 criteria.setCacheable(true);
145 criteria.list();
146 }
147 }
148 }

 

posted @ 2019-07-09 18:14  ƃuədnxıəʍ  阅读(313)  评论(0编辑  收藏  举报