我想在bean中更改私有字段的值,而不修改spring项目代码的表面逻辑,只需要添加我开发的依赖项。详情如下:
详细信息
我只能在这个spring项目中修改它的pom.xml,在这里我将添加我自己的依赖项,如下所示。
<dependency>
<groupId>my.task.is</groupId>
<artifactId>modify-spring-bean-private-field-value</artifactId>
<version>0.1</version>
</dependency>Spring如下所示,我想在我添加的依赖项中修改它的值。
// 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应该有一个解决方案来访问这个字段并在项目之外修改它的值,但是由于我已经在这个依赖项中使用了spring,所以AspectJ似乎与它冲突,使得spring代码不起作用。我将考虑使用100%的AspectJ作为我的最后一个选择。
这似乎需要修改spring项目中的InSpringProjectConfig类。
我仍然希望修改bean中的私有字段,而不是替换整个bean。
发布于 2021-07-02 11:21:58
最后从baeldung.com得到了一个解决方案,非常感谢给我发电子邮件的Eugen,我把它粘贴在下面。
粗略地说,您应该遵循以下步骤:
1-创建一个实现EnvironmentPostProcessor接口的类,将一个优先于应用程序使用的其他属性源的PropertySource添加到Spring。当然,您可以定义自己的机制来设置这个PropertySource,但是一个简单的实现可以如下所示:
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文件中:
org.springframework.boot.env.EnvironmentPostProcessor=com.baeldung.mylibrary.spring.MyCustomEnvironmentPostProcessor就是这样,现在您的应用程序将注入这个自定义属性源的值,因为它具有更高的优先级。
发布于 2021-07-01 04:45:35
@Value注释可以用于将值注入Spring托管bean中的字段,也可以应用于字段或构造函数/方法参数级别。单击这里获取更多信息。
@Value(${some.value.in.spring.project.config.file.that.I.would.not.touch})
private String changeMe; 由于它是一个Spring,并且没有Setter &属性是private,所以更改值的唯一方法是在properties文件中进行更改。
https://stackoverflow.com/questions/68204096
复制相似问题