spring中Bean的自动装配

通过property标签可以手动指定给属性进行注入,然后Spring 容器可以在不使用<constructor-arg><property> 元素的情况下完成属性的自动注入,就是自动装配,可以简化DI的配置,这有助于减少编写基于 Spring 的应用程序的 XML 配置的数量。

一、自动装配模式

下列自动装配模式,它们可用于指示 Spring 容器为来使用自动装配进行依赖注入。你可以使用<bean>元素的 autowire 属性为一个 bean 定义指定自动装配模式。

模式描述
no 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。
byName 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
byType 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。
constructor 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
autodetect(3.0版本不支持) Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。

可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合。

二、自动装配的局限性

当自动装配始终在同一个项目中使用时,它的效果最好。如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个 bean 定义。不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之前考虑到自动装配的局限性和缺点。

限制描述
重写的可能性 你可以使用总是重写自动装配的 <constructor-arg>和 <property> 设置来指定依赖关系。
原始数据类型 你不能自动装配所谓的简单类型包括基本类型,字符串和类。
混乱的本质 自动装配不如显式装配精确,所以如果可能的话尽可能使用显式装配。

三、案例解析

3.1.准备实体类

创建实体类:Dept

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
    private Integer deptNo;
    private String deptName;
    private String loc;
}

创建实体类:Emp

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Dept dept;
    private String username;
    private String sex;
}

3.2.创建配置文件

创建配置文件:applicationContext5.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"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
">
    <bean id="dept" class="com.augus.pojo.Dept">
        <property name="deptNo" value="10"/>
        <property name="deptName" value="研发部"/>
        <property name="loc" value="上海黄浦"/>
    </bean>

    <!--
    autowire 属性控制自动将容器中的对象注入到当前对象的属性上,有一下选项:
        byName 根据目标id值和属性值注入,要保证当前对象的属性值和目标对象的id值一致
        byType 根据类型注入,要保证相同类型的目标对象在容器中只有一个实例
    -->
    <bean id="emp" class="com.augus.pojo.Emp" autowire="byName">
        <property name="username" value="liming"/>
        <property name="sex" value="男"/>
    </bean>

</beans>

3.3.测试代码

import com.augus.Emp;
import com.augus.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test5 {
    @Test
    public void testGetBean(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
        // 获取对象 , 并且输出其属性的值
        Emp emp = context.getBean("emp", Emp.class);
        System.out.println(emp);

    }

}
posted @ 2019-10-22 14:28  酒剑仙*  阅读(592)  评论(0编辑  收藏  举报