被代理過後的類屬性值消失了?
阿新 • • 發佈:2019-12-31
被代理過後的類屬性值消失了?
前言
在使用SpringBoot開發時,我們如果要用到自定義的值,我們通常做法是在Yml
配置檔案配置相應的屬性,然後在類中配置相應的配置檔案獲得屬性值。例如我們在Yml
中有下面一個屬性值
test:
value: secondAgent
複製程式碼
那麼我們可以在類中做如下配置就可以從中取出值
@Component
public class GetValue {
@Value("${test.value}")
public String testValue;
}
複製程式碼
在使用的時候直接通過自動注入此類就能獲取到屬性值
@Autowired
private GetValue getValue;
@Override
public void run(String... args) throws Exception {
System.out.println(getValue.testValue);
}
複製程式碼
問題描述
但是在有一次開發中,在專案啟動後怎麼獲取值都獲取不到。在追溯最近一次修改檔案情況下,發現了加了事務的管理。事務管理加到了整個service資料夾中。而將此配置檔案移出service資料夾以後值又能獲取到了。
- service
- common
- 配置類所在的位置
複製程式碼
配置類大概如下
@Data
@Component
public class GetValue {
@Value("${test.value}")
public String testValue;
}
複製程式碼
注意此處的編碼不規範的地方,屬性值使用了public修飾,而在使用的時候也沒有通過get()方法來獲取值
在使用事務的時候會在此類的基礎上生成一個代理類,而代理類屬性值是傳遞不過來的。我們可以看到被代理的配置類如下
而如果我們此時直接通過自動注入獲取到的是被代理的類,而呼叫代理類只有呼叫方法級別才能夠到達原類,如果直接獲取屬性值是獲取不到的。所以此時如果我們直接呼叫getValue.testValue
獲得值只能是null。
解決辦法
- 要不就將此類移出被代理的資料夾。不生成代理類
- 使用
get()
方法進行獲取屬性值