Spring_Autowiring collaborators

在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配)、byName,byType,constructor下面来分别介绍一下这些是如何自动装配的

<bean id="foo" class="...Foo" autowire="autowire type">

Mode

Explanation

no

(Default) No autowiring. Bean references must be defined via a ref element. Changing the default setting is not recommended for larger deployments, because specifying collaborators explicitly gives greater control and clarity. To some extent, it documents the structure of a system.

byName

Autowiring by property name. Spring looks for a bean with the same name as the property that needs to be autowired. For example, if a bean definition is set to autowire by name, and it contains a master property (that is, it has a setMaster(..) method), Spring looks for a bean definition named master, and uses it to set the property.

byType

Allows a property to be autowired if exactly one bean of the property type exists in the container. If more than one exists, a fatal exception is thrown, which indicates that you may not use byType autowiring for that bean. If there are no matching beans, nothing happens; the property is not set.

constructor

Analogous to byType, but applies to constructor arguments. If there is not exactly one bean of the constructor argument type in the container, a fatal error is raised.

案例分析:

1、创建CumputerBean类

package www.csdn.spring.autowire.bean;

public class CumputerBean {

// 电脑名称

private String name;

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "CumputerBean [name=" + name + "]";

}

}

2、创建DeptBean 类

package www.csdn.spring.autowire.bean;

public class DeptBean {

//部门名称

private String name;

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "DeptBean [name=" + name + "]";

}

}

3、创建EmployeeBean

package www.csdn.spring.autowire.bean;

public class EmployeeBean {

private DeptBean deptBean;

private CumputerBean cumputerBean;

public void setDeptBean(DeptBean deptBean) {

this.deptBean = deptBean;

}

public void setCumputerBean(CumputerBean cumputerBean) {

this.cumputerBean = cumputerBean;

}

@Override

public String toString() {

return "EmployeeBean [deptBean=" + deptBean + ", cumputerBean="

+ cumputerBean + "]";

}

}

首先分析no、byName、byType的配置都是采用setter方法依赖注入实现的案例

1、no配置(通过ref=””引用需要的bean)

<?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean  根据EmployeeBean中的 属性名称  去匹配-->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean">

<property name="cumputerBean" ref="cumputerBean" />

<property name="deptBean" ref="deptBean" />

</bean>

</beans>

2、byName配置(分析:会根据EmployeeBean中属性的名称 自动装配)

<?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean-->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean" autowire="byName"/>

</beans>

3、byType配置(分析:会根据EmployeeBean中属性的类型 自动装配)

<?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean  根据EmployeeBean中的 属性名称  去匹配-->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean" autowire="byType"/>

</beans>

注意:当根据byType类型装配时,当在容器内找到多个匹配的类型时会出现如下bug

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'employeeBean' defined in class path resource [spring-byType.xml]: Unsatisfied dependency expressed through bean property 'deptBean': : No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean,deptBean1; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean,deptBean1

4、Constructor(构造器参数根据byType类型匹配,自动装配)

首先修改EmployeeBean类 修改后代码如下:

package www.csdn.spring.autowire.bean;

public class EmployeeBean {

private DeptBean deptBean;

private CumputerBean cumputerBean;

public EmployeeBean(DeptBean deptBean, CumputerBean cumputerBean) {

super();

this.deptBean = deptBean;

this.cumputerBean = cumputerBean;

}

@Override

public String toString() {

return "EmployeeBean [deptBean=" + deptBean + ", cumputerBean="

+ cumputerBean + "]";

}

}

配置文件操作:

 <?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"

autowire="constructor">

</bean>

</beans>

说明:

1、当构造器的参数类型在容器中找不全时。

比如:

配置文件中只配置了CumpterBean时

  <?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"

autowire="constructor">

</bean>

</beans>

会出现如下bug:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [www.csdn.spring.autowire.bean.DeptBean]: : No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Caused by:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

2、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:

<?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 部门bean -->

<bean id="deptBean1" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"

autowire="constructor">

</bean>

</beans>

说明:上面配置有两个同样类型的DeptBean但是不会出现bug,原因是在EmployeeBean中构造器接受的参数名称与deptBean一致。

3、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:

<?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 -->

<bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">

<property name="name" value="HP6325笔记本" />

</bean>

<!-- 部门bean -->

<bean id="deptBean1" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 部门bean -->

<bean id="deptBean2" class="www.csdn.spring.autowire.bean.DeptBean">

<property name="name" value="CSDN教育事业部" />

</bean>

<!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->

<bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"

autowire="constructor">

</bean>

</beans>

会出现如下bug(与byType的bug一致):

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [www.csdn.spring.autowire.bean.DeptBean]: : No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean1,deptBean2; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean1,deptBean2

 

Spring学习(三)—— 自动装配案例分析的更多相关文章

  1. Spring学习(三)--高级装配

    一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...

  2. Spring学习笔记--自动装配Bean属性

    Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...

  3. Spring学习(三)-----Spring自动装配Beans

    在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义“autowire”属性. <bean id="custom ...

  4. Spring(六)之自动装配

    一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者  ...

  5. Spring 由构造函数自动装配

    Spring 由构造函数自动装配,这种模式与 byType 非常相似,但它应用于构造器参数. Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 ...

  6. 【面试普通人VS高手系列】Spring Boot中自动装配机制的原理

    最近一个粉丝说,他面试了4个公司,有三个公司问他:"Spring Boot 中自动装配机制的原理" 他回答了,感觉没回答错误,但是怎么就没给offer呢? 对于这个问题,看看普通人 ...

  7. spring学习总结——高级装配学习二(处理自动装配的歧义性)

    我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...

  8. Spring 学习——Spring注解——Autowiring(自动装配)

    装配方式 方式一:默认 方式二:byName:根据属性名称自动装配.会查找Bean容器内部所有初始化的与属性名成相同的Bean,自动装配.(需要通过set方法注入,注入Bean的id名称需要和实体类的 ...

  9. Spring注解驱动开发(三)-----自动装配

    自动装配 概念 Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值. @Autowired-----自动注入 1.默认优先按照类型去容器中找对应的组件 application ...

随机推荐

  1. 跨域详解之-----Jsonp跨域

    一.通过jsonp跨域 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的. 比如 ...

  2. operator.itemgetter() 字典列表排序

    ## 字典列表排序 students = [ {"name": "Stanley", "age": 22, "score" ...

  3. Postgresql 入门笔记

    引言     最近整理了一些PostgreSQL的 常用命令,仅供参考   1. 入门命令 # 重启数据库 $ service postgresql-9.5 restart # 登陆: $ psql ...

  4. visual studio进程或线程自上一个步骤以来已更改

    1.自己的解决方案:visual studio在多进程执行,在配置页面(webconfig)里把UseCounterThread参数设置为0 2.公司其他人解决方案,自己试了,多进程执行的时候没起作用 ...

  5. PHP基础1--环境搭建

    主要: 环境搭建 站点配置 环境搭建 web运行流程: 1. 浏览器输入地址,回车(发送请求) 2. 根据规则找到对应web服务器.规则如下: 首先在本机hosts文件中找对应IP hosts位置: ...

  6. day 25 模块与包

    一.模块   模块就是一个包含了python定义和申明的文件,文件名就是模块的名字加上.py的后缀/ 模块的分类:     1.使用python编写的py文件     2.已被编译位共享库或者DLL或 ...

  7. 『Python基础-4』字符串

    # 『Python基础-4』字符串 目录 1.什么是字符串 2.修改字符串 2.1 修改字符串大小 2.2 合并(拼接)字符串 2.3 使用乘号'*'来实现字符串的叠加效果. 2.4 在字符串中添加空 ...

  8. Java-谈谈对Java平台的理解

    问题 谈谈对 Java 平台的理解 Java是解释执行的 这句话对么 程序的编译与解释有什么区别 Java 平台的了解 Java的主要特点是两个, 编写一次到处运行 Write once, run a ...

  9. 关于Json.dumos中的ensure_ascii

    在使用json,dumps时,当需要输出中文时,需要在后面添加  ensure_ascii = Fasle 因为json.dumps 序列化时,默认对中文使用的是 ascii 编码,添加后才能输出中文 ...

  10. linux (rm指令) 及误删除解决

    今天在群里看见这一幕: 看到这儿,我们学习一下 这个RM指令 rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件 ...