Spring Annotations导入配置未调用

时间:2019-03-20 10:32:49

标签: java spring configuration spring-annotations

我正在尝试制作一个使用Spring批注导入配置的应用程序。对于这个问题,我将其缩小为两个文件。启动类:

package core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Slf4j
@Configuration
@Import(ConfigSettings.class)
public class Startup {
    public static void main (String args[]) {
    log.info("main class");
    }
}

和ConfigSettings 包核心;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Slf4j
@Configuration
@ComponentScan({"connections", "filter"})
@PropertySource({"classpath:config/${env.config:dev}.application.properties"})
public class ConfigSettings {

    public ConfigSettings() {
    log.info("Constructor ConfigSettings");
    }
}

我希望结果是:

[INFO]Constructor ConfigSettings
[INFO]main class

但是它仅显示主类。似乎根本没有调用config设置的构造函数。由于导入批注,我希望它能调用它。

谁能解释出什么问题了?预先谢谢你!

1 个答案:

答案 0 :(得分:2)

您最好的选择是使config类返回包含您的值的config对象。通常,我不倾向于添加一个包含所有内容的配置对象,但是每个组件(数据库,控制器等)都有一个配置文件。

然后,您可以将已配置的对象作为Bean返回,并让它弹簧注入。如果要为RestTemplate创建配置文件(作为简单示例):

@Service
public class RestClientConfig {

    @Value("${your.config.value}")
    private String yourValue;


    private final RestTemplate restTemplate = new RestTemplate();

    @Bean
    public RestTemplate restTemplate() {
      // Configure it, using your imported values
      // ...

      return restTemplate;
   }
}

但是,main方法在spring容器之外,您将无法以这种方式进行引导,但是使用上述方法,您可以在需要使用它的地方直接调用已配置的组件。