我有一个带外部配置的Maven Spring Boot应用程序。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
我有一个带@PropertySource
注释的配置类,它使用@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
。
答案 0 :(得分:1)
不要创建new Config()
个对象。这个由弹簧容器管理,因此你最多应该注入它。
<强>小结强>
Spring是依赖注入框架,意味着如果你需要一些依赖,它是由容器提供给你的,你不应该创建它。这些依赖项通常是spring bean,Spring知道如何创建和管理的对象。
返回给我们
@Configuration是spring用于定义bean的注释,通过@Bean
注释,稍后可以使用@Inject
注释由其他组件使用。我要做的是定义一个类似的pojo:
public class User(){
private String username;
private String password;
//getters,setters etc ...
}
然后在Config
类中定义bean,如:
@Bean
public User getUser(){
//..load user and password
return new User(user, password);
}
最后当你需要使用用户时,你可以这样做:
@Inject User user;
//now the properties will be not-null