Spring中提供了自动装配依赖对象的机制,但是在实际应用中并不推荐使用自动装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
自动装配是在配置文件中实现的,如下:
<bean id="***" class="***" autowire="byType">
只需要配置一个autowire属性即可完成自动装配,不用再配置文件中写<property>,但是在类中还是要生成依赖对象的setter方法。
Autowire的属性值有如下几个:
· byType 按类型装配 可以根据属性类型,在容器中寻找该类型匹配的bean,如有多个,则会抛出异常,如果没有找到,则属性值为null;
· byName 按名称装配 可以根据属性的名称在容器中查询与该属性名称相同的bean,如果没有找到,则属性值为null;
· constructor 与byType方式相似,不同之处在与它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常;
· autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType的方式进行自动装配。如果发现默认的构造器,那么将使用byType的方式。public class HelloBean { private String helloWord; //...省略getter、setter方法 }
xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="helloWord"> <value>Hello!Justin!</value> </property> </bean> </beans>
java:
public class SpringDemo { public static void main(String[] args) { Resource rs = new FileSystemResource("beans-config.xml"); BeanFactory factory = new XmlBeanFactory(rs); HelloBean hello = (HelloBean) factory.getBean("helloBean"); System.out.println(hello.getHelloWord()); } }
· index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;
· type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;
· ref 是指引用的依赖对象;
· value 当注入的不是依赖对象,而是基本数据类型时,就用value;
public class HelloBean { private String name; private String helloWord; // 建议有要无参数建构方法 public HelloBean() { } public HelloBean(String name, String helloWord) { this.name = name; this.helloWord = helloWord; } //...省略getter、setter方法 }
xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <constructor-arg index="0"> <value>Justin</value> </constructor-arg> <constructor-arg index="1"> <value>Hello</value> </constructor-arg> </bean> </beans>
java代码:
public class SpringDemo { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("beans-config.xml"); HelloBean hello = (HelloBean) context.getBean("helloBean"); System.out.print("Name: "); System.out.println(hello.getName()); System.out.print("Word: "); System.out.println(hello.getHelloWord()); } }
private String helloWord;
private Date date;
//...省略getter、setter方法
}
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
< property name ="date" >
< ref bean ="dateBean" />
</ property >
</ bean >
</ beans >
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext( "beans-config.xml");
HelloBean hello = (HelloBean) context.getBean( "helloBean");
System.out.print(hello.getHelloWord());
System.out.print( " It's ");
System.out.print(hello.getDate());
System.out.println( ".");
}
}
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byType" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
</ bean >
</ beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="byName" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
</ bean >
</ beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="constructor" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
</ bean >
</ beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
</ bean >
</ beans >
< bean id ="dateBean" class ="java.util.Date" />
< bean id ="helloBean" class ="onlyfun.caterpillar.HelloBean" autowire ="autodetect" dependeny-check ="all" >
< property name ="helloWord" >
< value >Hello! </ value >
</ property >
</ bean >
</ beans >
private String[] someStrArray;
private Some[] someObjArray;
private List someList;
private Map someMap;
public String[] getSomeStrArray() {
return someStrArray;
}
public void setSomeStrArray(String[] someStrArray) {
this.someStrArray = someStrArray;
}
public Some[] getSomeObjArray() {
return someObjArray;
}
public void setSomeObjArray(Some[] someObjArray) {
this.someObjArray = someObjArray;
}
public List getSomeList() {
return someList;
}
public void setSomeList(List someList) {
this.someList = someList;
}
public Map getSomeMap() {
return someMap;
}
public void setSomeMap(Map someMap) {
this.someMap = someMap;
}
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
< beans >
< bean id ="some1" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >Justin </ value >
</ property >
</ bean >
< bean id ="some2" class ="onlyfun.caterpillar.Some" >
< property name ="name" >
< value >momor </ value >
</ property >
</ bean >
< bean id ="someBean" class ="onlyfun.caterpillar.SomeBean" >
< property name ="someStrArray" >
< list >
< value >Hello </ value >
< value >Welcome </ value >
</ list >
</ property >
< property name ="someObjArray" >
< list >
< ref bean ="some1" />
< ref bean ="some2" />
</ list >
</ property >
< property name ="someList" >
< list >
< value >ListTest </ value >
< ref bean ="some1" />
< ref bean ="some2" />
</ list >
</ property >
< property name ="someMap" >
< map >
< entry key ="MapTest" >
< value >Hello!Justin! </ value >
</ entry >
< entry key ="someKey1" >
< ref bean ="some1" />
</ entry >
</ map >
</ property >
</ bean >
</ beans >
public static void main(String[] args) {
ApplicationContext context =
new FileSystemXmlApplicationContext(
"beans-config.xml");
SomeBean someBean =
(SomeBean) context.getBean( "someBean");
// 取得数组型态依赖注入对象
String[] strs =
(String[]) someBean.getSomeStrArray();
Some[] somes =
(Some[]) someBean.getSomeObjArray();
for( int i = 0; i < strs.length; i++) {
System.out.println(strs[i] + ","
+ somes[i].getName());
}
// 取得List型态依赖注入对象
System.out.println();
List someList = (List) someBean.getSomeList();
for( int i = 0; i < someList.size(); i++) {
System.out.println(someList.get(i));
}
// 取得Map型态依赖注入对象
System.out.println();
Map someMap = (Map) someBean.getSomeMap();
System.out.println(someMap.get( "MapTest"));
System.out.println(someMap.get( "someKey1"));
}
}
十、静态工厂的方法注入
十一、实例工厂的方法注入