@ConfigurationProperties
其主要作用是將配置文件中特定屬性轉換爲Java對象,方便管理和使用。
其可以作爲單獨的Bean使用,也可以配合@Configuration使用(好像有點廢話了)
@Configuration註解使用
SpringBoot 自定義starter組件
注:本文以將aliyun短信sdk中所需配置提升到Springboot配置文件中爲例
與配置文件對應關係
application.yml配置文件
spring:
aliyun:
domain: dysmsapi.aliyuncs.com
regionid: cn-hangzhou
accessKeyId: ********
secret: ******************
version: 2017-05-25
對應Class
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.aliyun")
public class AliyunProperties {
private String domain;
private String version;
private String regionid;
private String accessKeyId;
private String secret;
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getRegionid() {
return regionid;
}
public void setRegionid(String regionid) {
this.regionid = regionid;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
}
至此,當你的AliyunProperties.java在Spring的掃描路徑(scanBasePackages)下時,配置文件到對象的配置就已經完成了(注意並不能直接使用)。
在SpringBoot項目中的使用
基於Spring的IOC的思想,此時AliyunProperties是不能被別的Bean所注入的,原因因爲:
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
boolean ignoreInvalidFields() default false;
boolean ignoreUnknownFields() default true;
}
其並未聲明未Spring的組件,如果想像其他Bean那樣直接交由IOC容器進行實例化,聲明此類時加上@Component註解標註其爲Bean組件即可:
@ConfigurationProperties(prefix = "spring.aliyun")
@Component //將其聲明爲Bean組件,注入到IOC容器中
public class AliyunProperties {
//... 代碼在上面
}
在@Configuration註解下使用實例:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
/**
* 阿里雲服務客戶端
*/
@Configuration
public class AcsClient {
// 阿里雲配置
private static DefaultProfile profile = null;
private static AcsSmsClient acsSmsClient = null;
@Bean
public IAcsClient client(AliyunProperties aliyunProperties){
// 省略具體實現,不影響解讀
}
}
作爲普通Bean組件使用
@RestController
@RequestMapping("/sms")
public class SmsController {
@Autowired
AliyunProperties aliyunProperties;
}
通過以上兩種使用方式,可以看到,在AliyunProperties這個Bean使用的時候屬性已經是配置文件裏的內容,也就是說AliyunProperties實例化後的屬性是經過修改的(默認全爲空),那麼是什麼時候修改的呢?這就需要了解@ConfigurationProperties的實現原理(關鍵點:Spring的Bean後處理器)。
其實在SpringBoot中還有個註解與@ConfigurationProperties比較相近@EnableConfigurationProperties, 這兩者是配合使用的,@EnableConfigurationProperties註解是將指定的@ConfigurationProperties標註的類Bean化,這種實現方式AliyunProperties.java就不需要再@Component去聲明瞭。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
/**
* 阿里雲服務客戶端
*/
@Configuration
@EnableConfigurationProperties({AliyunProperties.class})
public class AcsClient {
// 阿里雲配置
private static DefaultProfile profile = null;
private static AcsSmsClient acsSmsClient = null;
@Bean
public IAcsClient client(AliyunProperties aliyunProperties){
// 省略具體實現,不影響解讀
}
}
@Value的使用
首先說明一點,@Value是spring-bean內提供的屬性裝配註解;
其使用方式有兩種:
${ property : default_value } // 讀取配置文件內屬性(無需默認值的時候請連“:”一併省略,參見下面代碼)
#{ obj.property? :default_value } // 讀取對象屬性(Bean)或者方法返回值(需要在前面增加@,如#{@obj.getValue()})
使用方式較爲簡單,在需要的Bean內直接使用註解即可
import org.springframework.beans.factory.annotation.Value;
@Service
public class DemoServiceImpl implements DemoService {
@Value("${base.server.serverurl}")
public String serverurl;
}