【问题标题】:autowired component is null自动装配组件为空
【发布时间】: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


【解决方案1】:

您必须将 Search 类注册为 Spring Bean,并在您想使用它时从 Spring 上下文中获取它。从 spring 上下文中获取 bean 很重要。如果您使用new 创建该类的对象,Spring 将无法了解该类并管理它的依赖关系。

您可以通过 @Autowire 在某个地方或通过访问上下文的实例并使用 getBean 方法从 Spring 上下文中获取 bean:

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
     public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(AppConfig.class, args);
        ctx.getBean...
    }
}

在类上使用@Component注解并确保该类在my.package下的包中

或者在配置类中注册

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Bean
    public Search search(){
        return new Search();
    }
}

【讨论】:

  • 如果我使用第二种方法,我如何实例化/使用 Seach?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2015-07-28
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多