自动装配组件为空

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();
    }
}