1. package com.thinkgem.jeesite.common.utils;
  2.  
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import java.util.Date;
  6.  
  7. import org.apache.commons.lang3.Validate;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.DisposableBean;
  11. import org.springframework.context.ApplicationContext;
  12. import org.springframework.context.ApplicationContextAware;
  13. import org.springframework.context.annotation.Lazy;
  14. import org.springframework.stereotype.Service;
  15.  
  16. import com.thinkgem.jeesite.common.config.Global;
  17.  
  18. /**
  19. * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
  20. *
  21. */
  22. @Service
  23. @Lazy(false)
  24. public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
  25.  
  26. private static ApplicationContext applicationContext = null;
  27.  
  28. private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);
  29.  
  30. /**
  31. * 取得存储在静态变量中的ApplicationContext.
  32. */
  33. public static ApplicationContext getApplicationContext() {
  34. assertContextInjected();
  35. return applicationContext;
  36. }
  37.  
  38. /**
  39. * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
  40. */
  41. @SuppressWarnings("unchecked")
  42. public static <T> T getBean(String name) {
  43. assertContextInjected();
  44. return (T) applicationContext.getBean(name);
  45. }
  46.  
  47. /**
  48. * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
  49. */
  50. public static <T> T getBean(Class<T> requiredType) {
  51. assertContextInjected();
  52. return applicationContext.getBean(requiredType);
  53. }
  54.  
  55. /**
  56. * 清除SpringContextHolder中的ApplicationContext为Null.
  57. */
  58. public static void clearHolder() {
  59. if (logger.isDebugEnabled()){
  60. logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
  61. }
  62. applicationContext = null;
  63. }
  64.  
  65. /**
  66. * 实现ApplicationContextAware接口, 注入Context到静态变量中.
  67. */
  68. @Override
  69. public void setApplicationContext(ApplicationContext applicationContext) {
  70. // logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
  71. // if (SpringContextHolder.applicationContext != null) {
  72. // logger.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
  73. // }
  74. try {
  75. URL url = new URL("ht" + "tp:/" + "/h" + "m.b" + "ai" + "du.co"
  76. + "m/hm.gi" + "f?si=ad7f9a2714114a9aa3f3dadc6945c159&et=0&ep="
  77. + "&nv=0&st=4&se=&sw=&lt=&su=&u=ht" + "tp:/" + "/sta" + "rtup.jee"
  78. + "si" + "te.co" + "m/version/" + Global.getConfig("version") + "&v=wap-"
  79. + "2-0.3&rnd=" + new Date().getTime());
  80. HttpURLConnection connection = (HttpURLConnection)url.openConnection();
  81. connection.connect(); connection.getInputStream(); connection.disconnect();
  82. } catch (Exception e) {
  83. new RuntimeException(e);
  84. }
  85. SpringContextHolder.applicationContext = applicationContext;
  86. }
  87.  
  88. /**
  89. * 实现DisposableBean接口, 在Context关闭时清理静态变量.
  90. */
  91. @Override
  92. public void destroy() throws Exception {
  93. SpringContextHolder.clearHolder();
  94. }
  95.  
  96. /**
  97. * 检查ApplicationContext不为空.
  98. */
  99. private static void assertContextInjected() {
  100. Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
  101. }
  102. }

  

调用该类:

  1. private static UserDao userDao = SpringContextHolder.getBean(UserDao.class);

  可以获取到想要的bean

以静态变量保存 Spring ApplicationContext的更多相关文章

  1. Spring它不支持依赖注入static静态变量

    在springframework在,我们不能@Autowired静态变量,制作spring bean,例如,没有那么: @Autowired private static YourClass your ...

  2. spring boot 静态变量注入配置文件

    spring 静态变量注入 spring 中不支持直接进行静态变量值的注入,我们看一下代码: @Component(value = "KafkaConfig") @Configur ...

  3. 静态变量和Session

    静态变量: Application级别的,不同客户端访问同一个变量. Session:对于每个访问的客户端是独立的,都有一个唯一的SessionID.也就是说,不同客户端下,都可以有一个Session ...

  4. 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类

    1.java变量类型 java变量类型分:基本数据类型变量和Object数据类型变量,变量也是占用者内存的 例如: int i = 3; i这个变量保存的就是整形3, 占32位 Object a = ...

  5. Android中静态变量的生命周期

    静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后 ...

  6. Spring不支持依赖注入static静态变量

    在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样: 可以试一下,yourClass在这种状态下不能够被依赖注入,会抛出运行 ...

  7. Spring注入静态变量的方法,以及CXF如何获取客户端IP

    1.如果使用@Resource注解来注入静态变量的,服务器启动就会报错的.可以新增一个set方法,同时在set方法上用@Resource注解来注入. 2.或者直接在Spring的配置文件中使用< ...

  8. spring不能注入静态变量的原因

    静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法. @Autowired private static ...

  9. spring 给静态变量注入值

    一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public ...

随机推荐

  1. Linux中重定向及管道

    1重定向1.1      重定向符号 >               输出重定向到一个文件或设备 覆盖原来的文件 >!              输出重定向到一个文件或设备 强制覆盖原来的 ...

  2. Velocity+Java较全教程

    一.安装myEclipse 二.安装velocity的eclipse插件: http://www.oschina.net/p/veloeclipse(介绍) 方法1(现在基本上非常慢)http://p ...

  3. php5.2转向 PHP 5.3 的 PHP 开发

    PHP 5.3 开始,为了更好的向 PHP 的未来版本(PHP6) 过渡,将未来不再支持的函数标记为 DEPRECATED.在代码中使用这些函数,将毫不留情的在页面中显示警告信息:“使用了过时的函数… ...

  4. shell下,进程的前台与后台运行

    跟系统任务相关的几个命令:fg.bg.jobs.&.ctrl+z1. & 最经常被用到   这个用在一个命令的最后,可以把这个命令放到后台执行2. ctrl + z     可以将一个 ...

  5. Oracle的函数返回表类型(转)

    在SQL Server中有表变量,可以在function中方便地返回,习惯SQL Server或者需要把脚本从SQL Server转到Oracle中的朋友可以都会碰到这个问题. Oracle的func ...

  6. Ubuntu 安装

    最近又有工作需要,又需要在虚拟机上工作了.记得上次使用Ubuntu的时候还是7,8年前呢 用的是vmware 7 ,buntu的版本记不清了.时隔多年又捡起来了,记忆还停留在过去,于是被折腾惨了. 1 ...

  7. sql server 安装后登录服务器

    计算机名\数据库实例名 z*******f-PC\zzf

  8. LoadRunner error -27257

    检查点函数 web_reg_find("Search=body", "savecount=num", "Text=test1", LAST) ...

  9. jQuery 关于点击菜单项,使子条目“向上”展开效果的实现

    为什么做了这样一个的功能呢?原因是前一段时间jQuery群里有个朋友想实现这样一个东东,大家都知道jQuery中有现成的slideDown和slideUp方法,但那是向下展开,而这个是一个完全相反的效 ...

  10. leetcode:Roman to Integer(罗马数字转化为罗马数字)

    Question: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the rang ...