【发布时间】:2016-05-01 12:35:25
【问题描述】:
我正在用 spring 开发一个 web 应用程序。我没有问题自动装配和使用数据库@Service 类。现在我正在尝试读取一个全局属性文件并将值提供给所有需要它们的类。到目前为止,我提出的解决方案对于这样一个微不足道的任务来说似乎过于复杂(太多类 - AppConfig、ServerConfig iface、ElasticServerConfig),但如果它有效,我可以接受。
我的 applicationContext.xml 包含
<context:component-scan base-package="my.package" />
AppConfig.java:
package my.package.configuration;
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
}
ServerConfig.java:
public interface ServerConfig {
String getUrl();
String getUser();
String getPassword();
}
ElasticSearchConfig.java:
package my.package.configuration;
@Component(value = "elasticServerConfig")
public class ElasticServerConfig implements ServerConfig {
private static final Logger LOGGER = LogManager.getLogger(ElasticServerConfig.class);
private String url;
private String user;
private String password;
@Autowired
public ElasticServerConfig(final Environment env) {
this.url = env.getProperty("elastic_server.url");
this.user = env.getProperty("elastic_server.user");
this.password = env.getProperty("elastic_server.password");
LOGGER.debug("url=" + url + "; user=" + user + "; password=" + password); // this works!
}
@Override
public final String getUrl() {
return url;
}
@Override
public final String getUser() {
return user;
}
@Override
public final String getPassword() {
return password;
}
}
当 Web 应用程序启动时,ElasticServerConfig 构造函数会打印出从 application.properties 读取的正确 url/user/pwd。但是 ElasticServerConfig 的实例不会注入到 Search 对象中:
package my.package.util;
public class Search {
@Autowired
@Qualifier("elasticServerConfig")
private ServerConfig elasticServerConfig;
public final List<Foobar> findByPatternAndLocation() {
if (elasticServerConfig == null) {
LOGGER.error("elasticServerConfig is null!");
}
// and i get a NullPointerException further on
// snip
}
}
【问题讨论】:
-
Search类未使用 spring-component 注释进行注释,因此 spring 对此一无所知。它需要有@Component或类似的spring 来实例化类,并且能够注入ServerConfig -
我将 Seach 类注释为 org.springframework.stereotype.Component 但 elasticServerConfig 仍然为空。
标签: java spring properties autowired