文档章节

如何在Spring加载bean之前设置系统属性

zgw06629
 zgw06629
发布于 2015/07/20 20:34
字数 422
阅读 224
收藏 0

Spring Junit 单元测试 在bean初始化前设置系统属性

背景:

已有代码,有些工厂类通过System.getProperty("xxx")来得到配置信息, 进行单元测试时想通过代码来显式设置系统属性, 而不是手工在eclispe中配置,如-Ddbconfig=/etc/config/db.config. 

失败尝试一:

刚开始天真的以为只要在运行测试方法前设置系统属性即可,如下所示:

 @org.junit.Before
  public void setUp() {
       System.setProperty("dbconfig", "/etc/config/db.config");
  }

结果证明在进入setUp时,spring就已完成了bean的初始话了, 故在进入setUp前,就会抛出空指针异常.

失败尝试二:

想能不能在spring加载bean之前,就设置系统属性,尝试了如下的方法,

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
        p:targetObject="#{@systemProperties}" p:targetMethod="putAll" depends-on="rdsFactory" >
        <property name="arguments">
        	<map>
        		<entry key="dbconfig" value="/etc/config/db.config"></entry>
        	</map>
        </property>
        
    </bean>

即在applicationContext一开始就设置系统属性,发现也不灵,spring加载bean时,加载上述的MethodInvokingFactoryBean bean的顺序是随机的,故有可能在加载它之前就报空指针异常了.

可以观察如下的日志输出:

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@543e710e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,......org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy

成功尝试:

最后尝试了如下的方法,可以满足要求,即程序运行一开始就添加系统属性

static {
    System.out.println("Set system properties...");
   
    System.setProperty("dbconfig", "/etc/config/db.config");
  }

即将添加系统属性的代码放在在测试类中的静态代码块中,这样的话运行单元测试时,便会首先执行静态代码块中的内容了.


参考文档:

http://stackoverflow.com/questions/3339736/set-system-property-with-spring-configuration-file

http://stackoverflow.com/questions/10997136/set-system-property-for-junit-runner-eclipse-to-test-a-spring-web-app


© 著作权归作者所有

共有 人打赏支持
zgw06629

zgw06629

粉丝 17
博文 54
码字总数 30471
作品 0
海淀
程序员
私信 提问
说说 Spring Bean 之间的特殊关系

在 Spring 容器中,两个 Bean 之间除了通过 建立依赖关系外,还存在着一些特殊关系。 1 继承 在面向对象的编程原理中,当多个类拥有相同的方法和属性时,则可以引入父类用于消除重复的代码 ...

deniro
2018/05/05
0
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
2018/12/15
0
0
2019年一线大厂春招:Spring面试题和答案合集(上篇)

什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为...

别打我会飞
03/31
0
0
细说不懂Spring底层原理带来的伤与痛

什么是spring? Spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为...

老道士
2018/09/04
0
0
[转载]69道Spring面试题和答案

原文地址 http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概......

王木东
2017/03/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
今天
6
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
6
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
10
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部