我有2个bean:A,B
A里有字段用@Value注入,A还有个初始化方法;
B里的初始化方法需要用到A的@Value字段和初始化方法的结果
请问我该怎么配置才能让B正确初始化?
我有2个bean:A,B
A里有字段用@Value注入,A还有个初始化方法;
B里的初始化方法需要用到A的@Value字段和初始化方法的结果
请问我该怎么配置才能让B正确初始化?
@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]