首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从依赖关系jar修改bean中私有字段的值?

如何从依赖关系jar修改bean中私有字段的值?
EN

Stack Overflow用户
提问于 2021-07-01 03:55:49
回答 2查看 610关注 0票数 1

我想在bean中更改私有字段的值,而不修改spring项目代码的表面逻辑,只需要添加我开发的依赖项。详情如下:

详细信息

我只能在这个spring项目中修改它的pom.xml,在这里我将添加我自己的依赖项,如下所示。

代码语言:javascript
复制
<dependency>
    <groupId>my.task.is</groupId>
    <artifactId>modify-spring-bean-private-field-value</artifactId>
    <version>0.1</version>
</dependency>

Spring如下所示,我想在我添加的依赖项中修改它的值。

代码语言:javascript
复制
// no touch for anything in this class in spring project
@Configuration
public class InSpringProjectConfig {  
    @Value(${some.value.in.spring.project.config.file.that.I.would.not.touch})
    private String changeMe;  // no Setter for this field in this class
    ..
}

我试过什么

  • 反射

我尝试使用getFields和getDeclaredFields来获取getFields bean的字段,但是所有字段都以名称作为前缀,比如CGLIB$,而且没有人有类似于changeMe的名称。

  • AspectJ

理论上,AspectJ应该有一个解决方案来访问这个字段并在项目之外修改它的值,但是由于我已经在这个依赖项中使用了spring,所以AspectJ似乎与它冲突,使得spring代码不起作用。我将考虑使用100%的AspectJ作为我的最后一个选择。

  • 春豆制作钩

这似乎需要修改spring项目中的InSpringProjectConfig类。

  • 替换bean

我仍然希望修改bean中的私有字段,而不是替换整个bean。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-02 11:21:58

最后从baeldung.com得到了一个解决方案,非常感谢给我发电子邮件的Eugen,我把它粘贴在下面。

粗略地说,您应该遵循以下步骤:

1-创建一个实现EnvironmentPostProcessor接口的类,将一个优先于应用程序使用的其他属性源的PropertySource添加到Spring。当然,您可以定义自己的机制来设置这个PropertySource,但是一个简单的实现可以如下所示:

代码语言:javascript
复制
public class MyCustomEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Map<String, Object> myProperties =
            Collections.singletonMap("some.value.in.spring.project.config.file.that.I.would.not.touch", "changed-value");

        environment.getPropertySources()
            .addFirst(new MapPropertySource("myProps", myProperties));
    }
}

2-然后您可以将以下条目添加到库中的META/Spring.Factory文件中:

代码语言:javascript
复制
org.springframework.boot.env.EnvironmentPostProcessor=com.baeldung.mylibrary.spring.MyCustomEnvironmentPostProcessor

就是这样,现在您的应用程序将注入这个自定义属性源的值,因为它具有更高的优先级。

票数 0
EN

Stack Overflow用户

发布于 2021-07-01 04:45:35

@Value注释可以用于将值注入Spring托管bean中的字段,也可以应用于字段或构造函数/方法参数级别。单击这里获取更多信息。

代码语言:javascript
复制
@Value(${some.value.in.spring.project.config.file.that.I.would.not.touch})
private String changeMe; 

由于它是一个Spring,并且没有Setter &属性是private,所以更改值的唯一方法是在properties文件中进行更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68204096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档