大佬们 请教一下关于 Spring 的 @Value 注解 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
max58
V2EX    Java

大佬们 请教一下关于 Spring 的 @Value 注解

  •  
  •   max58 Mar 16, 2022 2863 views
    This topic created in 1502 days ago, the information mentioned may be changed or developed.

    我目前遇到的情况大概如下:

    class Test{ @Value("${xxxx}") private String a1; @Value("${xxxx}") private String a2; @Value("${xxxx}") private String a3; private Demo demo; public Test(){ demo = Demo.builder(a1,a2,a3); } } 

    a1,a2,a3 是从公司的配置中心拉去的值 现在出现这种情况: 在启动项目加载的时候,只会加载 a1,a2,a3 并不会给赋值 导致注入 demo 的参数都是 null 个人认为 spring 在加载的时候会把对应的值拉取到然后赋予变量 有没有大佬明白,教一下菜鸡。

    个人的解决办法:创建的一个 Config 类 能保证能够拉取到值然后完成注入

    @Configuration public class DemoConfig { @Value("${xxxx}") private String a1; @Value("${xxxx}") private String a2; @Value("${xxxx}") private String a3; @Bean public Demo bulid() throws MalformedURLException, SignatureException { return new Demo.Builder(a1,a2,a3); } } class Test{ @Resource private Demo demo; } 
    14 replies    2022-03-16 22:09:05 +08:00
    XhstormR02
        1
    XhstormR02  
       Mar 16, 2022 via Android
    Test 类构造方法在 @Value 注入之前就调用了
    max58
        2
    max58  
    OP
       Mar 16, 2022
    @XhstormR02 我之前还试过一种写法 在 成员字符串变量前加 static 和 不在构造方法中创建 直接去 new 也是不行的
    bringyou
        3
    bringyou  
       Mar 16, 2022
    可以在 postcontruct (或者 InitializingBean 的 afterPropertiesSet )里面初始化 demo
    xjngbla
        4
    xjngbla  
       Mar 16, 2022
    楼主是在 controller 里使用的这个注解么
    Kasumi20
        5
    Kasumi20  
       Mar 16, 2022
    为什么 Demo 不去存 Test 的引用
    zzfer
        6
    zzfer  
       Mar 16, 2022
    @Value 注解必须再 spring 注解标注后的类(@Configuration,@Controller,@Service 等)才能起作用吧
    BiChengfei
        7
    BiChengfei  
       Mar 16, 2022
    @Component
    public class Test {

    private Demo demo;

    public Test(@Value("${demo.a1}") String a1,@Value("${demo.a2}") String a2,@Value("${demo.a3}") String a3){
    demo = Demo.build(a1,a2,a3);
    }

    }
    max58
        8
    max58  
    OP
       Mar 16, 2022
    @xjngbla Service 层 是有 @Swevice 这个注解的
    max58
        9
    max58  
    OP
       Mar 16, 2022
    @zzfer 是有 @Service 注解的
    max58
        10
    max58  
    OP
       Mar 16, 2022
    @BiChengfei 我去试一下
    zzfer
        11
    zzfer  
       Mar 16, 2022
    如果你想在静态代码或非 spring 注解标注的类里使用。可以在 demo 里写好 a1 ,a2 ,a3 的 get 方法,通过这样获取
    DemoConfig demoCOnfig= ApplicationContextHolder.getBean(DemoConfig .class);
    String a1 = demoConfig .getA1();
    ikas
        12
    ikas  
       Mar 16, 2022
    bean 的生命周期基础,常用以下几种方案

    1. 使用 @PostConstruct
    2. 实现 InitializingBean 接口
    3. 指定 initMethod 方法,如 @Bean(initMethod = "init")


    如果想看详细,看 spring 文档 Receiving Lifecycle Callbacks 部分
    paradoxs
        13
    paradoxs  
       Mar 16, 2022
    如果是需要从配置中心获取值,要用 @PostConstruct
    1194129822
        14
    1194129822  
       Mar 16, 2022
    知其然,知其所以然。楼主还停留在使用阶段,建议楼主去了解一下 spring bean 的生命周期,BeanPostProcessor ,InstantiationAwareBeanPostProcessor 。核心生成 bean 的逻辑在 AbstractAutowireCapableBeanFactory.doCreateBean ,大致流程 createBeanInstance->populateBean->initializeBean ,createBeanInstance 就是实例化,populateBean 就是填充属性,set 和字段注入(@Value ,@Autowired..),initializeBean 就是初始化( Aware, @PostConstruct ,InitializingBean..)。所以 initializeBean 阶段的回调都可以读取注入的值。
    About     Help     Advertise     Blog     API     FAQ     Solana     1070 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 23:26 PVG 07:26 LAX 16:26 JFK 19:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86