spring2.0之自動裝配
Bar.java
public class Bar {
}
}
Foo.java
public class Foo {
}
}
SimpleTest.java
public class SimpleTest {
private Foo foo;
private Foo foo2;
private Bar bar;
public SimpleTest(){
}
public SimpleTest(Foo foo, Bar bar) {
System.out.println("constructor bar,foo call");
this.foo = foo;
this.bar = bar;
}
public SimpleTest(Foo foo) {
System.out.println("constructor foo call");
this.foo = foo;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
System.out.println("property bar set");
this.bar = bar;
}
public Foo getFoo() {
return foo;
}
public void setFoo(Foo foo) {
System.out.println("property foo set");
this.foo = foo;
}
public Foo getFoo2() {
return foo2;
}
public void setFoo2(Foo foo2) {
System.out.println("property foo2 set");
this.foo2 = foo2;
}
}
private Foo foo;
private Foo foo2;
private Bar bar;
public SimpleTest(){
}
public SimpleTest(Foo foo, Bar bar) {
System.out.println("constructor bar,foo call");
this.foo = foo;
this.bar = bar;
}
public SimpleTest(Foo foo) {
System.out.println("constructor foo call");
this.foo = foo;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
System.out.println("property bar set");
this.bar = bar;
}
public Foo getFoo() {
return foo;
}
public void setFoo(Foo foo) {
System.out.println("property foo set");
this.foo = foo;
}
public Foo getFoo2() {
return foo2;
}
public void setFoo2(Foo foo2) {
System.out.println("property foo2 set");
this.foo2 = foo2;
}
}
xml配置文件:
<beans>
<!-- 定義foo和bar -->
<bean id="foo" class="Foo"/>
<bean id="bar" class="Bar"/>
<!-- 使用ByName方式裝配,這種方式的原理是如果目標bean有一個名為foo的屬性而bean工廠有一個同名的bean,則把這個bean裝配給目標bean的屬性 Spring容器查找與SimpleTest屬性名稱(即foo和bar)相同的Bean,然后自動注入到該屬性中,否則不會注入 -->
<bean id="simpleTest1" class="SimpleTest" autowire="byName"/>
<!-- 使用ByType方式裝配,這種方式的原理是如果目標bean的屬性類型和bean工廠中的一個bean的類型相府,則把這個bean裝配給目標bean,如果對于一個相符,則出現異常 Spring容器查找與SimpleTest屬性的設值方法參數類型(即Foo和Bar)兼容的Bean -->
<bean id="simpleTest2" class="SimpleTest" autowire="byType"/>
<!-- 使用constructor方式,這種方式的原理是最大數量的匹配目標bean的構造方法,如果目標bean有一個String的構造方法,一個String和int的構造方法 bean工廠中也有string和int兩個bean,則spring會裝配String和int的構造方法
<!-- 定義foo和bar -->
<bean id="foo" class="Foo"/>
<bean id="bar" class="Bar"/>
<!-- 使用ByName方式裝配,這種方式的原理是如果目標bean有一個名為foo的屬性而bean工廠有一個同名的bean,則把這個bean裝配給目標bean的屬性 Spring容器查找與SimpleTest屬性名稱(即foo和bar)相同的Bean,然后自動注入到該屬性中,否則不會注入 -->
<bean id="simpleTest1" class="SimpleTest" autowire="byName"/>
<!-- 使用ByType方式裝配,這種方式的原理是如果目標bean的屬性類型和bean工廠中的一個bean的類型相府,則把這個bean裝配給目標bean,如果對于一個相符,則出現異常 Spring容器查找與SimpleTest屬性的設值方法參數類型(即Foo和Bar)兼容的Bean -->
<bean id="simpleTest2" class="SimpleTest" autowire="byType"/>
<!-- 使用constructor方式,這種方式的原理是最大數量的匹配目標bean的構造方法,如果目標bean有一個String的構造方法,一個String和int的構造方法 bean工廠中也有string和int兩個bean,則spring會裝配String和int的構造方法
Spring容器將試圖找出所有與構造方法的參數類型兼容的Bean
-->
<bean id="simpleTest3" class="SimpleTest" autowire="constructor"/>
<!-- 自動裝配方式,這種方式會自動在byType和Constructor中自動匹配,當目標bean有一個無參(本例)構造方法是,spring會選擇使用byType方式 -->
<bean id="simpleTest4" class="SimpleTest" autowire="autodetect"/>
</beans>
-->
<bean id="simpleTest3" class="SimpleTest" autowire="constructor"/>
<!-- 自動裝配方式,這種方式會自動在byType和Constructor中自動匹配,當目標bean有一個無參(本例)構造方法是,spring會選擇使用byType方式 -->
<bean id="simpleTest4" class="SimpleTest" autowire="autodetect"/>
</beans>
測試:
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class TestSpring {
public static void main(String args[]) throws Exception{
//獲取bean factory
BeanFactory factory=(BeanFactory)getBeanFactory();
SimpleTest simpleTest=null;
System.out.println("use byName:");
simpleTest=(SimpleTest)factory.getBean("simpleTest1");
System.out.println("use byType:");
simpleTest=(SimpleTest)factory.getBean("simpleTest2");
System.out.println("use byContructor:");
simpleTest=(SimpleTest)factory.getBean("simpleTest3");
System.out.println("use byAuto:");
simpleTest=(SimpleTest)factory.getBean("simpleTest4");
}
public static BeanDefinitionRegistry getBeanFactory() {
//獲取bean factory
String realpath="";
//加載配置項
realpath=System.getProperty("user.dir")+File.separator+"src"+File.separator+File.separator+"beans.xml";
XmlBeanFactory factory=new XmlBeanFactory(new FileSystemResource(realpath));
return factory;
}
}
public static void main(String args[]) throws Exception{
//獲取bean factory
BeanFactory factory=(BeanFactory)getBeanFactory();
SimpleTest simpleTest=null;
System.out.println("use byName:");
simpleTest=(SimpleTest)factory.getBean("simpleTest1");
System.out.println("use byType:");
simpleTest=(SimpleTest)factory.getBean("simpleTest2");
System.out.println("use byContructor:");
simpleTest=(SimpleTest)factory.getBean("simpleTest3");
System.out.println("use byAuto:");
simpleTest=(SimpleTest)factory.getBean("simpleTest4");
}
public static BeanDefinitionRegistry getBeanFactory() {
//獲取bean factory
String realpath="";
//加載配置項
realpath=System.getProperty("user.dir")+File.separator+"src"+File.separator+File.separator+"beans.xml";
XmlBeanFactory factory=new XmlBeanFactory(new FileSystemResource(realpath));
return factory;
}
}
結果:
2008-2-29 10:26:04 org.springframework.core.CollectionFactory <clinit>
信息: JDK 1.4+ collections available
2008-2-29 10:26:04 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\MyWork\AutoWire\src\beans.xml]
use byName:
property bar set
property foo set
property foo2 set
use byType:
property bar set
property foo set
property foo2 set
use byContructor:
constructor bar,foo call
use byAuto:
property bar set
property foo set
property foo2 set
信息: JDK 1.4+ collections available
2008-2-29 10:26:04 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:\MyWork\AutoWire\src\beans.xml]
use byName:
property bar set
property foo set
property foo2 set
use byType:
property bar set
property foo set
property foo2 set
use byContructor:
constructor bar,foo call
use byAuto:
property bar set
property foo set
property foo2 set
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1675871