为什么@Autowired annotation将同一类的每个bean关联到context.xml中



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");      
}
}

Foo:

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 calledn");
}
}

Main:

public class TestFooBar {
public static void main(String[] args) throws InterruptedException {
    System.out.println("nMain invokedn");
    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"((中指定了具有secondary Foo-id的bean,那么为什么在te上下文中,bean都被实例化了呢?

如果我去掉这两个注释,系统输出的结果是一样的!这怎么可能?

您在annotation.xml上下文中指定了两个Foo bean,因此Spring实例化了这两个bean(以及您的bar bean(。

然后,除此之外,它还将secondaryFoo作为依赖项注入到bar bean中。

如果不希望自动创建bean,可以在annotation.xml 中将它们声明为lazy-init="true"

最新更新