SpringBoot屬性注入的各種姿勢(含2.2.0版本最新方式)

常見的spring boot屬性注入相關注解

常見的SpringBoot屬性注入使用的註解類含以下幾種:

  • @Value:常用於字段上,將Spring加載到的屬性匹配注入到當前實例字段,可通過冒號:設置屬性默認值。
  • @Configuration:作用於類上,聲明一個類作爲配置類並生成單例到Spring容器中。
  • @PropertySource:作用於類上,讀取指定資源文件屬性,常與@Configuration@ConfigurationProperties一起使用,可通過application.yml的引入配置取代該註解的使用。
  • @ConfigurationProperties:作用於類或方法上,將加載到的屬性進行前綴匹配,再根據屬性名與註解類中的字段名匹配進行屬性注入,可與@PropertySource@Configuration一起使用,在配置文件中可通過冒號:設置屬性默認值。2.2.0版本後大部分情況下無需再與@Configuration組合使用

2.2.0版本後新增的屬性注入相關注解:

  • @DefaultValue:作用域參數上,設置不可變屬性時的默認值的註釋。
  • @ConstructorBinding:作用於類或構造方法上,通過通過函數而非set方法進行屬性注入,常與@ConfigurationProperties一起使用,適用於設置不可變屬性,建議不可變屬性通過構造方法設置而非set方法。
  • @ConfigurationPropertiesScan:生成指定package下@ConfigurationProperties註解的屬性配置類單例並進行屬性注入放入容器管理。

在2.2.0版本之後的@SpringBootApplication註解添加了@ConfigurationPropertiesScan的功能,即應用啓動時會掃描@SpringBootApplication註解的啓動類所在package及所有子孫package下被@ConfigurationProperties註解的類並生成相應對象到容器中,因此2.2.0以後的版本@ConfigurationProperties大部分情況下都可單獨使用,不需再與@Configuration組合生成實例。以下爲2.2.0之後的SpringBootApplication:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ConfigurationPropertiesScan
public @interface SpringBootApplication {
	...
}

各註解屬性注入用例

  • @Value用例

    @Value("${server.port:8080}") //沒有設置則默認設爲8080
    private String port;
    
  • @PropertySource用例

    classpath添加datasource.properties:

    datasource.url=test-url
    datasource.username=wilson
    datasource.password=test-password
    datasource.driver=${db.driver:com.mysql.jdbc.Driver}
    

    屬性配置類DataSourceProperties :

    @PropertySource("classpath:datasource.properties")
    @ConfigurationProperties("datasource")
    @Configuration
    @Data
    @Slf4j
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    
  • @ConfigurationProperties用例

    application.yml添加db配置:

    datasource:
      url: test-url
      username: wilson
      password: test-password
      driver: ${db.driver:com.mysql.jdbc.Driver}
    

    也可在resources下新建一個application-datasource.yml進行屬性配置,再通過application.yml中添加spring.profiles.include: datasource進行文件的屬性引入。

    屬性配置類DataSourceProperties :

    @ConfigurationProperties("datasource")
    @Configuration
    @Data
    @Slf4j
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    
  • @ConstructorBinding與@DefaultValue用例

    用例1:

    @ConfigurationProperties("datasource")
    @Slf4j
    @ConstructorBinding
    @AllArgsConstructor
    @Getter
    @ToString
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    

    用例2:

    @ConfigurationProperties("datasource")
    @Slf4j
    @ConstructorBinding
    @Getter
    @ToString
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        public DataSourceProperties(String url, String username, String password, @DefaultValue("com.mysql.jdbc.Driver") String driver) {
            this.url = url;
            this.username = username;
            this.password = password;
            this.driver = driver;
        }
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    

    @DefaultValue註解的參數若沒有在配置文件中設置值或默認值,則初始化時使用註解中的值,即注入優先級爲:文件屬性值>文件屬性默認值>@Default註解值

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