使用Spring 4.0.3.RELEASE ...
我一直在将基于Spring XML的配置转换为JavaConfig,而且我遇到了一个我不理解的问题。在开发人员的机器(Windows 7和8)上运行时一切正常,但在构建服务器(Ubuntu)上运行时失败 - 作为构建的一部分,我们开始进行单元测试,并且在构建运行时进行单元测试服务器他们都失败了。症状是应用程序上下文getBean(“name”)返回null。以下是设置方法:
package com.x.common;
public class BeanFactory {
private static ApplicationContext _context;
static {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
if (ctx.getEnvironment().getActiveProfiles().length == 0) {
ctx.getEnvironment().setActiveProfiles("prod");
}
ctx.scan("com.x.common.config");
ctx.refresh();
_context = ctx;
}
public static Object get(String name) {
return _context.getBean(name);
}
}
package com.x.common.config;
@Configuration
public class AppConfig {
@Autowired ILogger logger;
@Bean public ILogger logger() {
return logger;
}
}
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean public ILogger logger() {
return new ConsoleLogger("prod");
}
}
我的单元测试基本上只是
ILogger logger = (ILogger)BeanFactory.get("logger");
assertNotNull("Logger is null", logger);
在开发人员计算机上执行单元测试时,无论是作为构建的一部分还是在Eclipse中单独运行,logger都是ConsoleLogger类型的对象。但是当单元测试在构建机器上执行时(由Jenkins调用),logger为null并且不会抛出任何异常。这里有几个人看过它,但我们都不是Spring大师(事实上我几周前才开始使用Spring),我们无法弄清楚问题是什么。当单元测试第一次开始时,一些东西被记录到控制台(Spring告诉我们它找到了AppConfig并且它用ProdConfig覆盖了返回值),并且在本地运行和运行时的打印输出看起来相同建造机器。关于问题可能是什么,没有什么明显的突出。
使用XML配置文件的情况很好,但是我们没有使用Autowire。