在使用SpringBoot開發時,咱們若是要用到自定義的值,咱們一般作法是在Yml
配置文件配置相應的屬性,而後在類中配置相應的配置文件得到屬性值。例如咱們在Yml
中有下面一個屬性值git
test:
value: secondAgent
複製代碼
那麼咱們能夠在類中作以下配置就能夠從中取出值github
@Component
public class GetValue {
@Value("${test.value}")
public String testValue;
}
複製代碼
在使用的時候直接經過自動注入此類就能獲取到屬性值bash
@Autowired
private GetValue getValue;
@Override
public void run(String... args) throws Exception {
System.out.println(getValue.testValue);
}
複製代碼
可是在有一次開發中,在項目啓動後怎麼獲取值都獲取不到。在追溯最近一次修改文件狀況下,發現了加了事務的管理。事務管理加到了整個service文件夾中。而將此配置文件移出service文件夾之後值又能獲取到了。ide
- service
- common
- 配置類所在的位置
複製代碼
配置類大概以下ui
@Data
@Component
public class GetValue {
@Value("${test.value}")
public String testValue;
}
複製代碼
注意此處的編碼不規範的地方,屬性值使用了public修飾,而在使用的時候也沒有經過get()方法來獲取值編碼
在使用事務的時候會在此類的基礎上生成一個代理類,而代理類屬性值是傳遞不過來的。咱們能夠看到被代理的配置類以下spa
而若是咱們此時直接經過自動注入獲取到的是被代理的類,而調用代理類只有調用方法級別纔可以到達原類,若是直接獲取屬性值是獲取不到的。因此此時若是咱們直接調用getValue.testValue
得到值只能是null。3d
get()
方法進行獲取屬性值