SpringBoot 常用注解的原理和使用( 二 )

  • ImportBeanDefinitionRegistrar 接口的實現 。
  • @Import 的配置
    @Configuration@Import(value = https://www.huyubaike.com/biancheng/{TestA.class, TestB.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})public class ConfigurationTest {}導入一個普通類
    package com.example.ssmpdemo.entity;public class TestA {public void fun(){System.out.println("testA");}}導入一個配置類
    package com.example.ssmpdemo.entity;import org.springframework.context.annotation.Configuration;@Configurationpublic class TestB {public void fun(){System.out.println("testB");}}通過實現 ImportSelector 接口
    import org.springframework.context.annotation.ImportSelector;import org.springframework.core.type.AnnotationMetadata;public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.example.ssmpdemo.entity.TestC"};}}通過重寫 ImportBeanDefinitionRegistrarregisterBeanDefinitions 方法 。
    import com.example.ssmpdemo.entity.TestD;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.beans.factory.support.RootBeanDefinition;import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;import org.springframework.core.type.AnnotationMetadata;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition root = new RootBeanDefinition(TestD.class);registry.registerBeanDefinition("testD", root);}}@ConfigurationProperties
    • 支持常見的下劃線、中劃線和駝峰的轉換 。支持對象引導 。比如:user.friend.name 代表的是user對象中的friend對象中的name
    • 需要有set()方法
    • 只添加 @ConfigurationProperties(prefix = "xxx") 并不會生效,需要配合 @Configuration 讓容器識別到 。
    • @EnableConfigurationProperties(value = https://www.huyubaike.com/biancheng/ConfigData.class ) 會將value中指定的類注冊為Bean,可直接用 @AutoWired 引用 。
    1. 定義一個類用來記錄所有字段 , 并使用@ConfigurationProperties(prefix = "xxx")將數據注入到ConfigData中 。
    package com.example.ssmpdemo.entity;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;/** * 用來記錄Configuration的數據 * @author wangc */@Data@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")public class ConfigData {private String driverClassName;private String url;private String username;private String password;}# 對應的yml文件spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:5506/ssmpdemo?serverTimezone=UTCusername: rootpassword: xxxx
    1. 使用@EnableConfigurationProperties(JDBCProperties.class)ConfigData 注冊為Bean,并提供給ConfigurationTest使用??蓪?code>ConfigData作為參數注入到構造函數和普通函數中 。
    2. 可以用以下方式引用被@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")修飾的ConfigData
    • 可以直接把 ConfigData 當成Bean使用/*** 可直接被注入*/@Autowiredprivate ConfigData configData;
    • 可以用構造函數傳入進來@Data@Configuration@EnableConfigurationProperties(value = https://www.huyubaike.com/biancheng/ConfigData.class )public class ConfigurationTest {private ConfigData configData2;/*** 作為構造函數的參數注入* @param data*/ConfigurationTest(ConfigData data){this.configData2 = data;}
    • 也可以作為@Bean的方法函數的參數 。只有當前類(ConfigurationTest)才可/*** 直接作為函數的參數* @param data* @return*/@Bean(name = "configData2")HashMap<String, String> getBean(ConfigData data){return new HashMap<>(0);}
    • 可以省略ConfigData直接將字段注入到返回結果中 。@Bean@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")HashMap<String, String> getBean2(ConfigData data){// 會自動為hashMap賦值,或使用set方法為對象賦值return new HashMap<>();}
    EnableConfigurationProperties注解的內部如下,它導入了一個實現了 ImportBeanDefinitionRegistrar 接口的類 。
    @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EnableConfigurationPropertiesRegistrar.class)

    推薦閱讀