Spring中基于XML的自动装配(自动赋值)

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的自动装配(自动赋值)的主要内容,如果未能解决你的问题,请参考以下文章

基于XML配置Spring的自动装配

spring自动装配bean入门教程

spring注解(属性赋值自动装配)

spring注解(属性赋值自动装配)

spring框架学习:Bean的装配方式 ——基于注解的装配自动装配

Spring 自动装配