@ConfigurationProperties的使用及與@Value的區別

@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;
}

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