被代理过后的类属性值消失了?
前言
在使用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()
方法进行获取属性值