@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,它同时使用 @Value
和 Environment
:
@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");
}
}
不幸的是,我在日志中看到 null
s。
不要创建 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
我有一个带有外部配置的 Maven Spring 引导应用程序。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
我有一个带有 @PropertySource
注释的配置 class,它同时使用 @Value
和 Environment
:
@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");
}
}
不幸的是,我在日志中看到 null
s。
不要创建 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