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:

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

各註解屬性注入用例

@Value用例

<code>@Value("${server.port:8080}") //沒有設置則默認設為8080 

private String port;/<code>

@PropertySource用例

resources添加datasource.properties:

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

屬性配置類DataSourceProperties:

<code>@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");
}
}/<code>

@ConfigurationProperties用例

application.yml添加db配置:

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

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

屬性配置類DataSourceProperties :

<code>@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");
}
}
/<code>

@ConstructorBinding與@DefaultValue用例

用例1(@ConstructorBinding

<code>@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");
}
}
/<code>

用例2(@ConstructorBinding與@DefaultValue組合

<code>@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");
}
}/<code>

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


分享到:


相關文章: