概述
Spring boot
应用中,当使用注解方式定义一个bean
时,同时可以利用@ConfigurationProperties
导入外部属性填充到这个bean
的实例。本文通过例子介绍了几种用法可以达到这种效果 :
- 方式1 :
@ConfigurationProperties
+@Component
注解到bean
定义类上 - 方式2 :
@ConfigurationProperties
+@Bean
注解在配置类的bean
定义方法上 - 方式3 :
@ConfigurationProperties
注解到普通类然后通过@EnableConfigurationProperties
定义为bean
本文的例子基于一个 Spring boot web
应用 :
完全采用缺省配置的最简Spring-boot Web应用
例子所采用配置文件
先在例子项目增加配置文件 src/main/resources/application.properties
,其内容如下
section1.name=Tom
section2.name=Jerry
section3.name=Dog
方式1 : @ConfigurationProperties
+ @Component
注解到bean
定义类上
类定义为bean
组件
// 将类定义为一个bean的注解,比如 @Component,@Service,@Controller,@Repository
// 或者 @Configuration
@Component
// 表示使用配置文件中前缀为 section1 的属性的值初始化该bean定义产生的的bean实例的同名属性
// 在使用时这个定义产生的bean时,其属性 name 会是 Tom
@ConfigurationProperties(prefix = "section1")
public class Bean1 {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
方式2 : @ConfigurationProperties
+ @Bean
注解在配置类的bean
定义方法上
bean
来自一个普通类
// 这是一个一般java类,POJO,没有任何注解
public class Bean2 {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
使用@Bean
注解将一个配置类的方法定义为一个bean
在项目的某个@Configuration
配置类中通过@Bean
注解在某个方法上将上面的POJO
类定义为一个bean
,并使用配置文件中相应的属性初始化该bean的属性。
这里所说的@Configuration
配置类可以是直接通过@Configuration
注解的配置类,也可以是隐含使用了@Configuration
注解的类,比如下面的例子中,@SpringBootApplication
隐含了@Configuration
。
// 声明为Spring boot 应用,隐含了注解@Configuration
@SpringBootApplication
public class Application {
// @Bean 注解在该方法上定义一个bean,这种基于方法的Bean定义不一定非要出现在
// @SpringBootApplication 注解的类中,而是出现在任何@Configuration注解了
// 的类中都可以
@Bean
// 使用配置文件中前缀为section2的属性的值初始化这里bean定义所产生的bean实例的同名属性,
// 在使用时这个定义产生的bean时,其属性 name 会是 Jerry
@ConfigurationProperties(prefix = "section2")
public Bean2 bean2() {
// 注意,这里的 Bean2 是上面所示的一个POJO类,没有任何注解
return new Bean2();
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
方式3 : @ConfigurationProperties
注解到普通类然后通过@EnableConfigurationProperties
定义为bean
注解一个普通类的属性将会来自外部属性文件
// 该注解声明如果该类被定义为一个bean,则对应的bean实例的属性值将来自配置文件中前缀为
// section3的同名属性。但是这个注解本身并不会导致该类被作为一个bean注册
@ConfigurationProperties(prefix = "section3")
public class Bean3 {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
使用@EnableConfigurationProperties
将上述类定义为一个bean
@SpringBootApplication
// 该注解会将类Bean3作为一个bean定义注册到bean容器,而类Bean3上的注解
// @ConfigurationProperties(prefix = "section3")会导致目标bean
// 实例的属性值使用配置文件中前缀为section3的同名属性值来填充,也就是目标
// bean的属性name的值会是Dog
@EnableConfigurationProperties({ Bean3.class})
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
相关文章
Spring BeanPostProcessor : ConfigurationPropertiesBindingPostProcessor