被代理过后的类属性值消失了?

被代理过后的类属性值消失了?

Posted by 不学无数 on August 13, 2019

被代理过后的类属性值消失了?

前言

在使用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()方法进行获取属性值

代码地址