@EnableConfigurationProperties注解使用
前言
当我们想把配置的内容,动态赋值到某个配置类上的时候,可以使用@EnableConfigurationProperties + @ConfigurationProperties注解
代码准备
创建配置文件prop.properties
name=ada
age=18
email=123@qq.com
创建配置类
@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
public class AppConfig {}
创建启动类
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);}
}
查看@ConfigurationProperties源码
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {/*** The prefix of the properties that are valid to bind to this object. Synonym for* {@link #prefix()}. A valid prefix is defined by one or more words separated with* dots (e.g. {@code "acme.system.feature"}).* @return the prefix of the properties to bind*/@AliasFor("prefix")String value() default "";/*** The prefix of the properties that are valid to bind to this object. Synonym for* {@link #value()}. A valid prefix is defined by one or more words separated with* dots (e.g. {@code "acme.system.feature"}).* @return the prefix of the properties to bind*/@AliasFor("value")String prefix() default "";/*** Flag to indicate that when binding to this object invalid fields should be ignored.* Invalid means invalid according to the binder that is used, and usually this means* fields of the wrong type (or that cannot be coerced into the correct type).* @return the flag value (default false)*/boolean ignoreInvalidFields() default false;/*** Flag to indicate that when binding to this object unknown fields should be ignored.* An unknown field could be a sign of a mistake in the Properties.* @return the flag value (default true)*/boolean ignoreUnknownFields() default true;}
由源码我们可以得知这个注解可以作用于类上,作用于方法上
作用于类上
@EnableConfigurationProperties注解不指定value
创建TypeConfig
@ConfigurationProperties
@Component
public class TypeConfig {private String name;private Integer age;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
配置类不指定value
@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
@EnableConfigurationProperties
public class AppConfig {}
运行main方法,查看运行结果
@EnableConfigurationProperties注解指定value
TypeConfig去除@Component注解
@ConfigurationProperties
public class TypeConfig {private String name;private Integer age;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
配置类指定value
@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
@EnableConfigurationProperties({TypeConfig.class})
public class AppConfig {}
运行main方法,查看运行结果
@ConfigurationProperties设置prefix
改造TypeConfig
@ConfigurationProperties(prefix = "prop")
public class TypeConfig {private String name;private Integer age;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
修改配置文件prop.properties
name=ada
age=18
email=123@qq.comprop.name=tom
prop.age=17
prop.email=456@qq.com
运行main方法,查看运行结果
使用@ConstructorBinding注解绑定到构造器上
改造TypeConfig
@ConfigurationProperties(prefix = "prop")
public class TypeConfig {private String name;private Integer age;private String email;public TypeConfig() {}@ConstructorBindingpublic TypeConfig(String name, Integer age, String email) {this.name = name;this.age = age;this.email = email;}
}
运行main方法,查看运行结果
PS : @ConstructorBinding注解只能在@EnableConfigurationProperties注解指定value的时候使用
作用于方法上
修改配置类prop.properties
name=ada
age=18
email=123@qq.comprop.name=tom
prop.age=17
prop.email=456@qq.commethod.name=bob
method.age=16
method.email=789@qq.com
创建MethodConfig
@Configuration
public class MethodConfig {@Bean@ConfigurationProperties(prefix = "method")public Person person() {return new Person();}public static class Person {private String name;private Integer age;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}
}
运行main方法,查看运行结果