自动装配组件为空
autowired component is null
我正在使用 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 的实例未注入到搜索对象中:
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
}
}
您必须将搜索 class 注册为 Spring Bean,并在您要使用它时从 Spring 上下文中获取它。从 spring 上下文中获取 bean 很重要。如果您使用 new
创建 class 的对象,Spring 无法了解 class 并管理它的依赖关系。
您可以从 Spring 上下文中获取一个 bean,方法是 @Autowire
它在某处或通过访问上下文实例并使用 getBean
方法:
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(AppConfig.class, args);
ctx.getBean...
}
}
在 class 上使用 @Component 注释并确保 class 在 my.package
下的包中
或者在配置中注册class
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
@Bean
public Search search(){
return new Search();
}
}
我正在使用 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 的实例未注入到搜索对象中:
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
}
}
您必须将搜索 class 注册为 Spring Bean,并在您要使用它时从 Spring 上下文中获取它。从 spring 上下文中获取 bean 很重要。如果您使用 new
创建 class 的对象,Spring 无法了解 class 并管理它的依赖关系。
您可以从 Spring 上下文中获取一个 bean,方法是 @Autowire
它在某处或通过访问上下文实例并使用 getBean
方法:
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(AppConfig.class, args);
ctx.getBean...
}
}
在 class 上使用 @Component 注释并确保 class 在 my.package
或者在配置中注册class
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
@Bean
public Search search(){
return new Search();
}
}