【发布时间】:2015-08-11 22:06:01
【问题描述】:
Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<bean id="foo" class="annotation.Foo">
<property name="name" value="firstFoo"></property>
</bean>
<bean id="secondaryFoo" class="annotation.Foo">
<property name="name" value="secondaryFoo"></property>
<qualifier value="secondaryFoo"></qualifier>
</bean>
<bean id="bar" class="annotation.Bar" />
栏:
public class Bar {
@Autowired
@Qualifier(value="secondaryFoo")
private Foo foo;
public void setFoo(Foo foo) {
this.foo = foo;
}
public void printFooName(){
System.out.println("\nBar class: foo.getName(): "+foo.getName()+"\n");
}
}
富:
public class Foo {
private String name;
public Foo(){
System.out.println("\nFoo class: Constructor invoked, name: "+ name + "\n");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@PostConstruct
public void init() {
System.out.println("\nFoo class: @PostConstruct Bean Foo successfully initialized, name: " + name +"\n");
}
@PreDestroy
public void cleanUp() {
System.out.println("*\nFoo class: @PreDestroy clean up called\n");
}
}
主要:
public class TestFooBar {
public static void main(String[] args) throws InterruptedException {
System.out.println("\nMain invoked\n");
AbstractApplicationContext applicationContext =
new ClassPathXmlApplicationContext("annotation/annotation.xml");
Bar bar = applicationContext.getBean("bar", Bar.class);
bar.printFooName();
}
}
当我运行应用程序时,系统会按以下顺序打印出来:
- Main invoked
- Foo class: Constructor invoked, name: null
- Foo class: @PostConstruct Bean Foo successfully initialized, name: firstFoo
- Foo class: Constructor invoked, name: null
- Foo class: @PostConstruct Bean Foo successfully initialized, name: secondaryFoo
- Bar class: foo.getName(): secondaryFoo
如果我在 Bar 类 (@Autowired @Qualifier(value="secondary Foo")) 中指定了具有辅助 Foo id 的 bean,为什么在 te 上下文中,bean 都被实例化了?
如果我去掉这两个注解,System out 的结果是一样的!怎么可能?
【问题讨论】:
标签: java xml spring annotations autowired