gpt4 book ai didi

java - 在 Pojo/对象上使用 @Value 的 Spring 可能性

转载 作者:行者123 更新时间:2023-12-02 02:28:28 28 4
gpt4 key购买 nike

请问关于 Spring 注释@Value 的小问题。

这个注解功能强大,广为人知,它提供了开箱即用的可能性,可以通过配置绑定(bind) boolean 值、字符串等类型,甚至更复杂的数据结构,如 List、Map

    @Value("${my.string}")
private String myString;

@Value("${my.flag}")
private Boolean someFlag;

@Value("#{'${my.list.of.strings}'.split(',')}")
private List<String> myListOfStrings;

@Value("#{${my.hashmap}}")
private Map<String, Integer> myHashMap;

application.properties
my.string=something
my.flag=true
my.list.of.strings=hello,world
my.hashmap={'hello':'world','aaa':'bbb','ccc':'ddd'}

问题:是否可以在我定义的某些 POJO 上使用@Value?像这样的东西:

  @Value("${my.pojo}")
private MyPojo myPojo;

public class MyPojo {

private String firstName;
private String lastName;
private int age;
private boolean isMarried;

}

application.properties
my.pojo={ "firstname": "john", "lastname": "doe", "isMarried": false, "age": 20 }

让@Value(或其他东西)获取它。我在上面尝试过,但没有得到 myPojo。请问在@Value 下配置这个可配置的解决方案是什么?

谢谢

最佳答案

Spring 无法将这些值注入(inject)到 POJO 中,因为根据定义,POJO 不由 Spring 的 IoC 容器管理。

如果您查看 @Value 注释的 Spring 文档(链接在底部),它指定“请注意,@Value 注释的实际处理是由 BeanPostProcessor 执行的”,这本身就非常明确类必须是 Spring bean,但如果上下文不够,请查看 BeanPostProcessor 文档(也在底部链接):“允许自定义修改新 bean 实例的工厂 Hook ——例如,检查标记接口(interface)或包装带代理的 bean ”

所以不,如果类不是由 Spring 的 IoC 容器管理的(即,如果类不是 Spring bean),值注释将不会被 BeanPostProcessor 捕获,因此不会有用。

值注释文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Value.html

BeanPostProcessor 文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html

如果绝对必要,您始终可以使用 jdk-native 类从属性文件中读取值(快速示例:https://www.javatpoint.com/properties-class-in-java)

郑重声明,POJO 是什么的规范意味着该类不能包含预先指定的注释。因此,即使在 @Value 可以在非 spring bean 上工作的另一个世界中,根据定义,它仍然会破坏类的 POJO 方面。

关于java - 在 Pojo/对象上使用 @Value 的 Spring 可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65365181/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com