@Configuration class @Value 为空

@Configuration class with empty @Value

我有一个带有外部配置的 Maven Spring 引导应用程序。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

我有一个带有 @PropertySource 注释的配置 class,它同时使用 @ValueEnvironment:

@Configuration
@PropertySource("file:/etc/koshka/application.properties")
public class Config 
{
    @Autowired
    private Environment env;

    @Bean
    public static PropertySourcesPlaceholderConfigurer configurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Value("${socmess.pass}")
    private String pass;

    public String getUser() {
        return env.getProperty("socmess.user");
    }

    public String getPass() {
        return pass;
    }
}

简而言之,我只需要 @Value,但我也测试了 Environment 选项。

我在相应的文件夹中有配置文件:

$ cat /etc/koshka/application.properties 
socmess.user="testuser"
socmess.pass="testpass"

在控制器中我正在实例化配置:

@RestController
public class Sender {
    private final Logger logger;

    public Sender() 
    {
        logger = (Logger)LogManager.getLogger("KoshkaBot");
    }

    @GetMapping("/vk")
    @CrossOrigin(origins = "*")
    public ResponseEntity<String> vk(
        @RequestParam(value="username") String username,
        @RequestParam(value="password") String password
    ) {
        Config conf = new Config();

        logger.info(conf.getUser());
        logger.info(conf.getPass());

        return ResponseEntity.ok().body("OK");
    }
}

不幸的是,我在日志中看到 nulls。

不要创建 new Config() 对象。这个由 spring 容器管理,因此你最多应该注入它。

回顾

Spring 是依赖注入框架,意味着如果你需要一些依赖,它是由容器提供给你的,你不应该创建它。这些依赖项通常是 spring beans,spring 知道如何创建和管理的对象。

返回给我们 @Configuration 是 spring 用来定义 bean 的注释,通过 @Bean 注释,稍后可以由其他组件使用 @Inject 注释使用。我要做的是定义一个 pojo,如:

public class User(){
   private String username;
   private String password;

   //getters,setters etc ...
}

然后在 Config class 中定义 bean,如:

@Bean
public User getUser(){
   //..load user and password
   return new User(user, password);
}

最后,当您需要使用用户时,您可以这样做:

@Inject User user;
//now the properties will be not-null