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

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

前言

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

解決辦法

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

代碼地址

相關文章
相關標籤/搜索