1. 程式人生 > 程式設計 >被代理過後的類屬性值消失了?

被代理過後的類屬性值消失了?

被代理過後的類屬性值消失了?

前言

在使用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。

解決辦法

  1. 要不就將此類移出被代理的資料夾。不生成代理類
  2. 使用get()方法進行獲取屬性值

程式碼地址