美文网首页程序园Java技术分享
被代理过后的类属性值消失了?

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

作者: 不学无数的程序员 | 来源:发表于2019-08-13 11:12 被阅读2次

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

前言

在使用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()方法来获取值

在使用事务的时候会在此类的基础上生成一个代理类,而代理类属性值是传递不过来的。我们可以看到被代理的配置类如下

image

而如果我们此时直接通过自动注入获取到的是被代理的类,而调用代理类只有调用方法级别才能够到达原类,如果直接获取属性值是获取不到的。所以此时如果我们直接调用getValue.testValue获得值只能是null。

解决办法

  1. 要不就将此类移出被代理的文件夹。不生成代理类
  2. 使用get()方法进行获取属性值

代码地址

相关文章

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

    被代理过后的类属性值消失了? 前言 在使用SpringBoot开发时,我们如果要用到自定义的值,我们通常做法是在Y...

  • iOS中代理的使用

    1.创建代理协议2.在要传值的类中创建一个该代理的属性 在需要接收值和实现该协议的类中遵从代理协议 设置并调用代理...

  • iOS (反向)传值

    代理、block、消息中心、单例。 正向传值 通过属性(特性)的值,在上个使用本类(所在类)对象的类中,直接传递其...

  • 反射+动态代理

    反射+动态代理反射:以类名得到该类的属性名,属性值,方法名,方法的默认返回值,然后调用set/invoke等方法来...

  • iOS开发-代理传值

    代理传值的步骤: 需要传值的界面操作步骤: 1.声明代理协议 2.声明代理方法 3.声明一个属性,用来表示当前类对...

  • Vue实例

    属性与方法: 每个 Vue 实例都会代理其data对象里所有的属性: 注意只有这些被代理的属性是响应的,也就是说值...

  • 精讲-第4章(3)委托属性

    定义 什么是委托属性?属性委托是指一个类的某个属性值不是在类中直接进行定义,而是将其委托给一个代理类,从而实现对该...

  • Swift常用的界面传值(属性传值、协议传值、闭包传值)

    1、属性传值 属性传值多用于正向传值(A->B) 2、代理传值 代理传值多用于反向传值(B->A) 3、闭包传值 ...

  • 控制器传值

    1、属性传值 2、回传值: 1.委托代理 <1>把发送数据的类做出委托类:声明协议,在协议中声明一些方法给委托类定...

  • 线程。回值

    控制器传值属性传值回传值委托代理: 把发送数据的类做成委托类:声明协议,在协议中声明一些方法,给委托类定义一个ID...

网友评论

    本文标题:被代理过后的类属性值消失了?

    本文链接:https://www.haomeiwen.com/subject/jqdvjctx.html