springboot 註解說明(@EnableConfigurationProperties)


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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章