zoukankan      html  css  js  c++  java
  • 配置springmvc在其他类中(spring容器外)获取注入bean

    学习https://github.com/thinkgem/jeesite

    今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autowired都不可以注入,因为spring不能为静态变量依赖注入。因此需要额外的方法获取spring管理的bean。本文即SpringContextHolder:

     1 package com.demo.common.utils;
     2 
     3 import org.apache.commons.lang3.Validate;
     4 import org.slf4j.Logger;
     5 import org.slf4j.LoggerFactory;
     6 import org.springframework.beans.BeansException;
     7 import org.springframework.beans.factory.DisposableBean;
     8 import org.springframework.context.ApplicationContext;
     9 import org.springframework.context.ApplicationContextAware;
    10 import org.springframework.context.annotation.Lazy;
    11 import org.springframework.stereotype.Service;
    12 
    13 /**
    14  * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
    15  * Created by Administrator on 2016/2/23.
    16  */
    17 @Service
    18 @Lazy(false)
    19 public class SpringContextHolder implements ApplicationContextAware ,DisposableBean {
    20     private static ApplicationContext applicationContext = null;
    21     private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);
    22 
    23     /**
    24      * 去的存储在静态变量中的ApplicationContext
    25      * @return
    26      */
    27     public static ApplicationContext getApplicationContext(){
    28         assertContextInjected();
    29         return applicationContext;
    30     }
    31 
    32     /**
    33      * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型
    34      * @param name
    35      * @param <T>
    36      * @return
    37      */
    38     public static <T> T getBean(String name){
    39         assertContextInjected();
    40         return (T)applicationContext.getBean(name);
    41     }
    42 
    43     /**
    44      * 从静态变量applicationContext中去的Bean,自动转型为所复制对象的类型
    45      * @param requiredType
    46      * @param <T>
    47      * @return
    48      */
    49     public static <T> T getBean(Class<T> requiredType){
    50         assertContextInjected();
    51         return (T)applicationContext.getBean(requiredType);
    52     }
    53 
    54     /**
    55      * 清楚SpringContextHolder中的ApplicationContext为Null
    56      */
    57     public static void clearHolder(){
    58         if(logger.isDebugEnabled()){
    59             logger.debug("清楚SpringContextHolder中的ApplicationContext:"+applicationContext);
    60         }
    61         applicationContext = null;
    62     }
    63 
    64 
    65     /**
    66      * 检查ApplicationContext不为空
    67      */
    68     private static void assertContextInjected() {
    69         Validate.validState(applicationContext!=null,"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
    70     }
    71 
    72     /**
    73      * 实现ApplicationContextAware接口,注入Context到静态变量
    74      * @param applicationContext
    75      * @throws BeansException
    76      */
    77     @Override
    78     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    79         SpringContextHolder.applicationContext = applicationContext;
    80     }
    81 
    82     /**
    83      * 实现DisposableBean接口,在Context关闭时清理静态变量
    84      * @throws Exception
    85      */
    86     @Override
    87     public void destroy() throws Exception {
    88         SpringContextHolder.clearHolder();
    89     }
    90 }
  • 相关阅读:
    安全体系(一)—— DES算法详解
    Windows下将gvim8配置为Python IDE
    SSH原理记录
    Spring Cloud 注册中心Eureka
    Spring Cloud 声明式服务调用 Feign
    Spring Cloud 客服端负载均衡 Ribbon
    Http服务器实现文件上传与下载(四)
    1.项目优化
    分支的创建与代码的推送——提交用户列表功能代码
    主页Header布局
  • 原文地址:https://www.cnblogs.com/woshimrf/p/5211191.html
Copyright © 2011-2022 走看看