springboot 註解說明(@EnableConfgurationProperties)
應用:帶有@ConfigurationProperties註解的類A從配置文件中讀取配置信息,@EnableConfigurationProperties將類A註冊爲容器的bean;
說明:也可以不使用@EnableConfigurationProperties,直接在類A上加註解(@Component等)將其註冊爲容器的bean
***********************
相關類與註解
@EnableConfigurationProperties:導入EnableConfigurationPropertiesRegistrar類
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EnableConfigurationPropertiesRegistrar.class})
public @interface EnableConfigurationProperties {
String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";
Class<?>[] value() default {};
}
EnableConfigurationPropertiesRegistrar
class EnableConfigurationPropertiesRegistrar implements ImportBeanDefinitionRegistrar {
EnableConfigurationPropertiesRegistrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
registerInfrastructureBeans(registry);
ConfigurationPropertiesBeanRegistrar beanRegistrar = new ConfigurationPropertiesBeanRegistrar(registry);
//使用ConfigurationPropertiesBeanRegistrar將類註冊爲容器的bean
this.getTypes(metadata).forEach(beanRegistrar::register); //遍歷value指定的類,進行註冊
}
private Set<Class<?>> getTypes(AnnotationMetadata metadata) { //獲取value指定的類
return (Set)metadata.getAnnotations().stream(EnableConfigurationProperties.class).flatMap((annotation) -> {
return Arrays.stream(annotation.getClassArray("value"));
}).filter((type) -> {
return Void.TYPE != type;
}).collect(Collectors.toSet());
}
static void registerInfrastructureBeans(BeanDefinitionRegistry registry) {
ConfigurationPropertiesBindingPostProcessor.register(registry);
BoundConfigurationProperties.register(registry);
ConfigurationPropertiesBeanDefinitionValidator.register(registry);
ConfigurationBeanFactoryMetadata.register(registry);
}
}
***********************
示例
******************
配置文件
application.yml
person:
name: 瓜田李下
age: 20
******************
pojo 層
@Data
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
}
******************
config 層
WebConfig:使用@EnableConfigurationProperties註解,將person註冊爲bean
@Configuration
@EnableConfigurationProperties(Person.class)
public class WebConfig {
}
******************
controller 層
HelloController
@RestController
public class HelloController {
@Resource
private Person person;
@RequestMapping("/hello")
public String hello(){
System.out.println(person);
return "success";
}
}
***********************
使用測試
localhost:8080/hello
2020-07-05 16:33:22.845 INFO 14192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-07-05 16:33:22.852 INFO 14192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms
Person(name=瓜田李下, age=20)