Spring中基于XML的自动装配(自动赋值)
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中基于XML的自动装配(自动赋值)相关的知识,希望对你有一定的参考价值。
Spring中基于XML的自动装配
手动赋值过程演示
Book类:
public class Book {
private String name;
private int money;
public void setName(String name) {
this.name = name;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\\'' +
", money=" + money +
'}';
}
}
Obj类:
public class Obj {
private Book book;
private List<Book> list;
public Obj(Book book, List<Book> list) {
this.book = book;
this.list = list;
}
public void setBook(Book book) {
this.book = book;
}
public void setList(List<Book> list) {
this.list = list;
}
@Override
public String toString() {
return "Obj{" +
"book=" + book +
", list=" + list +
'}';
}
xml配置文件:
<bean id="book" class="com.dhy.Factory.Book">
<property name="name">
<value>时间简史</value>
</property>
<property name="money" value="50"/>
</bean>
<!--为obj对象里面的自定义类型的属性赋值-->
<!--property: 手动赋值-->
<bean id="Obj" class="com.dhy.Factory.Obj">
<property name="book" ref="book"/>
</bean>
测试类:
public class main {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("factory.xml");
Obj bean = app.getBean(Obj.class);
System.out.println(bean);
}
}
自动装配(自动赋值)
autowire的默认属性是default,default等价于no
<!--自动装配
autowire="default",不自动装配,不自动为car属性赋值-->
<bean id="Obj" class="com.dhy.Factory.Obj" autowire="default">//这里还可以写autowire="no"
</bean>
按照某种规则自动装配
autowire=“byName”
按属性名称自动装配。 Spring寻找与需要自动装配的属性同名的bean。例如,如果一个bean定义被设置为按名称自动装配,并且包含一个master属性(即,它具有setMaster(…)方法),那么Spring将查找一个名为master的bean定义并使用它来设置该属性。
以Obj里面setBook成员方法的属性名作为ID,即book,去容器中找到这个组件,给他赋值
<bean id="book" class="com.dhy.Factory.Book">
<property name="name">
<value>时间简史</value>
</property>
<property name="money" value="50"/>
</bean>
<bean id="Obj" class="com.dhy.Factory.Obj" autowire="byName">
autowire=“byType”
如果容器中恰好存在一个属性类型的bean,则使该属性自动装配。如果存在多个,则将引发致命异常,这表明您可能无法对该bean使用byType自动装配。如果没有匹配的bean,则什么都不会发生(未设置该属性)。
以属性的类型,即Book.class,作为作为查找依据,去容器中找到这个组件
<bean id="Obj" class="com.dhy.Factory.Obj" autowire="byType">
如果容器中有多个相同类型的组件,报错。 如果没找到,装配null
autowire=“constructor”
与byType类似,但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个bean,则将引发致命错误。
第一步: 先按照有参构造器参数的类型进行装配,如果我们在为Obj的book属性通过有参构造进行赋值时,容器中没有Book相关组件,那么属性赋值为null
<bean id="Obj" class="com.dhy.Factory.Obj" autowire="constructor">
第二步: 如果按照类型找到多个,那么会以参数名作为ID继续匹配,找不到就为Null
集合自动装配----集合里面存放的类型是自定义类型
容器可以把容器中所有Book属性都放到对应的List集合中
Obj类:
public class Obj {
private List<Book> list;
public void setList(List<Book> list) {
this.list = list;
}
@Override
public String toString() {
return "Obj{"
+"list=" + list +
'}';
}
}
xml配置文件:
<bean id="book0" class="com.dhy.Factory.Book">
<property name="name">
<value>时间简史0</value>
</property>
<property name="money" value="50"/>
</bean>
<bean id="book1" class="com.dhy.Factory.Book">
<property name="name">
<value>时间简史1</value>
</property>
<property name="money" value="51"/>
</bean>
<bean id="book2" class="com.dhy.Factory.Book">
<property name="name">
<value>时间简史2</value>
</property>
<property name="money" value="52"/>
</bean>
<bean id="Obj" class="com.dhy.Factory.Obj" autowire="byType">
</bean>
自动装配只对自定义类型生效
以上是关于Spring中基于XML的自动装配(自动赋值)的主要内容,如果未能解决你的问题,请参考以下文章