yourname1111 2011-03-15 11:04
浏览 254
已采纳

spring bean 初始化问题

我有2个bean:A,B

A里有字段用@Value注入,A还有个初始化方法;
B里的初始化方法需要用到A的@Value字段和初始化方法的结果

请问我该怎么配置才能让B正确初始化?

  • 写回答

2条回答 默认 最新

  • iteye_235 2011-03-15 14:21
    关注

    @Value注入的时间比@PostConstruct[b]更早[/b],我修改了一下范例。
    [b]A.java[/b]
    [code="java"]
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.ImportResource;
    import org.springframework.stereotype.Component;

    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;

    @Component("a")
    @ImportResource("classpath:./properties-config.xml")
    public class A {
    @Resource(name = "aInject")
    private AInject aInject;
    @Value("#{testp[a_one]}")
    private String message;

    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public AInject getaInject() {
        return aInject;
    }
    
    public void setaInject(AInject aInject) {
        this.aInject = aInject;
    }
    
    @PostConstruct
    public void initA() {
        System.out.printf("A init do. [%s]\n", this.getMessage());
    }
    

    }[/code]
    [b]properties-config.xml[/b]
    [code="xml"]<?xml version="1.0" encoding="UTF-8"?>
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
    default-autowire="byName" default-lazy-init="true">

    <util:properties id="testp" location="classpath:./test.properties"/>
    

    [/code]
    [b]ABTest.java[/b]
    [code="java"]import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import scan.A;
    import scan.B;

    public class ABTest {
    private ApplicationContext ctx;
    private A a;
    private B b;

    @Before
    public void init() {
        ctx = new ClassPathXmlApplicationContext(
                new String[]{"META-INF/spring/applicationContext-bean.xml"});
        b = ctx.getBean("b", B.class);
        a = ctx.getBean("a", A.class);
    }
    
    @Test
    public void testAB() {
        System.out.printf("Msg:%s@%s@%s\n", a.getaInject().getInjectName(), b.getA().getaInject().getInjectName(),a.getMessage());
        a.getaInject().sayHello();
    }
    

    }[/code]
    test.properties
    [code="txt"]a_one=Hello[/code]
    执行ABTest测试的结果:
    A init do.[b] [Hello][/b]
    B init do.
    Msg:A inject.@A inject.@Hello
    Hello A inject.!
    [b]注意看在@PostConstruct的方法中@Value已经注入成功![/b]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 ARKts悬浮窗和快捷方式问题
  • ¥15 comparecluster没有办法kegg
  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES