Spring自动装配Bean详解

1.      Auto-Wiring ‘no’

2.      Auto-Wiring ‘byName’

3.      Auto-Wiring ‘byType

4.      Auto-Wiring ‘constructor’

5.      Auto-Wiring ‘autodetect’

Spring Auto-Wiring Beans——Spring自动装配Bean

所谓自动装配,就是将一个Bean注入到其他Bean的Property中,类似于以下:

<bean id="customer" class="com.lei.common.Customer" autowire="byName" />

Spring支持5种自动装配模式,如下:

no            ——默认情况下,不自动装配,通过“ref”attribute手动设定。

buName       ——根据Property的Name自动装配,如果一个bean的name,和另一个bean中的Property的name相同,则自动装配这个bean到Property中。

byType     ——根据Property的数据类型(Type)自动装配,如果一个bean的数据类型,兼容另一个bean中Property的数据类型,则自动装配。

constructor   ——根据构造函数参数的数据类型,进行byType模式的自动装配。

autodetect   ——如果发现默认的构造函数,用constructor模式,否则,用byType模式。

下例中演示自动装配

Customer.java如下:

package com.lei.common;

public class Customer
{
    private Person person;

    public Customer(Person person) {
        this.person = person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
    //...
}

Person.java如下:

package com.lei.common;

public class Person
{
    //...
}

1.      Auto-Wiring ‘no’

默认情况下,需要通过‘ref’来装配bean,如下:

<bean id="customer" class="com.lei.common.Customer">
    <property name="person" ref="person" />
</bean>
 <bean id="person" class="com.lei.common.Person" />

2.      Auto-Wiring ‘byName’

根据属性Property的名字装配bean,这种情况,Customer设置了autowire="byName",Spring会自动寻找与属性名字“person”相同的bean,找到后,通过调用setPerson(Person person)将其注入属性。

<bean id="customer" class="com.lei.common.Customer" autowire="byName" />

<bean id="person" class="com.lei.common.Person" />

如果根据 Property name找不到对应的bean配置,如下

<bean id="customer" class="com.lei.common.Customer" autowire="byName" />

<bean id="person_another" class="com.lei.common.Person" />

Customer中Property名字是person,但是配置文件中找不到person,只有person_another,这时就会装配失败,运行后,Customer中person=null。

3.      Auto-Wiring ‘byType

根据属性Property的数据类型自动装配,这种情况,Customer设置了autowire="byType",Spring会总动寻找与属性类型相同的bean,找到后,通过调用setPerson(Person person)将其注入。

<bean id="customer" class="com.lei.common.Customer" autowire="byType" />

<bean id="person" class="com.lei.common.Person" />

如果配置文件中有两个类型相同的bean会怎样呢?如下:

<bean id="customer" class="com.lei.common.Customer" autowire="byType" />

<bean id="person" class="com.lei.common.Person" />

<bean id="person_another" class="com.lei.common.Person" />

一旦配置如上,有两种相同数据类型的bean被配置,将抛出UnsatisfiedDependencyException异常,见以下:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: 

所以,一旦选择了’byType’类型的自动装配,请确认你的配置文件中每个数据类型定义一个唯一的bean。

4.      Auto-Wiring ‘constructor’

这种情况下,Spring会寻找与参数数据类型相同的bean,通过构造函数public Customer(Person person)将其注入。

<bean id="customer" class="com.lei.common.Customer" autowire="constructor" />

<bean id="person" class="com.lei.common.Person" />

 5.      Auto-Wiring ‘autodetect’

这种情况下,Spring会先寻找Customer中是否有默认的构造函数,如果有相当于上边的’constructor’这种情况,用构造函数注入,否则,用’byType’这种方式注入,所以,此例中通过调用public Customer(Person person)将其注入。

<bean id="customer" class="com.lei.common.Customer" autowire="autodetect" />

<bean id="person" class="com.lei.common.Person" />

注意:

项目中autowire结合dependency-check一起使用是一种很好的方法,这样能够确保属性总是可以成功注入。

<bean id="customer" class="com.lei.common.Customer"

            autowire="autodetect" dependency-check="objects" />

<bean id="person" class="com.lei.common.Person" />

最后,我认为,自动装配虽然让开发变得更快速,但是同时却要花更大的力气维护,因为它增加了配置文件的复杂性,你甚至不知道哪一个bean会被自动注入到另一个bean中。我更愿意写配置文件来手工装配。

原文地址:https://www.cnblogs.com/shamo89/p/9917609.html

时间: 2024-08-06 03:50:20

Spring自动装配Bean详解的相关文章

Spring探究-----自动装配Bean详解

1.xml配置文件(了解) 1.1 byName 按名称自动装配(推荐,需要get和set方法) 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配 <bean id="student" class="com.spring.autowire.Student" autowire="byName"> <property name="stuName" value

spring在IoC容器中装配Bean详解

1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean实例放入bean缓存池: 应用程序使用bean. 1.2.基于xml的配置 (1)xml文件概述 xmlns------默认命名空间 xmlns:xsi-------标准命名空间,用于指定自定义命名空间的schema文件 xmlns:xxx="aaaaa"-------自定义命名空间,xx

Spring 自动装配 Bean

Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Beans——Spring自动装配Bean 所谓自动装配,就是将一个Bean注入到其他Bean的Prope

Spring基础系列8 -- Spring自动装配bean

Spring基础系列8 -- Spring自动装配bean 转载:http://www.cnblogs.com/leiOOlei/p/3548290.html 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wiring ‘constructor’ 5.      Auto-Wiring ‘autodetect’ Spring Auto-Wiring Be

spring自动装配Bean属性

spring提供了3种类型的自动装配 byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType:把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中. constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中. byName自动装配 <bean id="roles" class="cn.com.ztz.spring.model.Roles&q

Spring自动装配Bean的五种方式

在Spring中,支持 5 自动装配模式. no – 缺省情况下,自动配置是通过"ref"属性手动设定,在项目中最常用byName – 根据属性名称自动装配.如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它.byType – 按数据类型自动装配.如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它.constructor – 在构造函数参数的byType方式.autodetect – 如果找到默认的构造函数,使用"自动装配用构造&qu

(转)java之Spring(IOC)注解装配Bean详解

在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看Annotation的魅力所在吧. 先来看看之前的bean注解装配例子: package com.eco.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import

spring 自动装配 bean 有哪些方式?

Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 隐式的bean发现机制和自动装配 在java代码或者XML中进行显示配置 参考链接:spring Bean装配的几种方式简单介绍 原文地址:https://www.cnblogs.com/jxxblogs/p/12147464.html

Spring探究-----配置Bean详解

声明一个实体类Car package com.spring.configureBean; /** * 车辆类 * * @author yyx 2019年6月11日 */ public class Car { /** * 车辆名称 */ private String carName; /** * 车辆价格 */ private Integer carPrice; public Car() { super(); } public Car(String carName, Integer carPric