常見的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
註解值