林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

set注入和构造注入有时在做配置时比较麻烦。所以框架为了提高开发效率,提供自动装配功能,简化配置。Spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性。自动装配属性有5个值可选,分别代表不同的含义。

本文工程免费下载

1、byName

从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值。如果有相同的,那么获取这个对象,实现关联。

整个Spring环境:表示所有的spring配置文件中查找,那么id不能有重复的。

2、byType

从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找<bean>标签的class属性值。如果有相同的,那么获取这个对象,实现关联。

        缺点:如果存在多个相同类型的bean对象,会出错。

如果属性为单一类型的数据,那么查找到多个关联对象会发生错误。

如果属性为数组或集合(泛型)类型,那么查找到多个关联对象不会发生异常。

3、constructor(3.x以上已不能用)

使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。如果没找到则抛出异常

4、autodetect

自动选择:如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。

5、no

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

<bean>标签的 autowire 属性,它负责自动装配<bean>标签定义 JavaBean 的属性。这样做可以省去很多配置 JavaBean 属性的标签代码,使代码整洁、美观。但是它也有负面影响,即使用自动装配之后,无法从配置文件中读懂 JavaBean 需要什么属性。自动装配存在很多不正确的装配问题,例如错误装载属性、“byType”属性和“constructor”属性对相同类型参数无法判断等。当然,将自动装配和手动装配混合使用也能解决此问题。下面通过一个实例来分析如何使用自动装配。

首先创建创建一个学生类 Student,定义学号、姓名、性别、年龄等属性,并添加对

应的 set()与 get()方法。程序代码如下。

package com.autobean;public class Student {private String ID;private String name;private int age;private String sex;public String getID() {return ID;}public void setID(String iD) {ID = iD;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}

同样创建一个教师类 Teacher,定义姓名、性别和年龄等属性,并添加对应的 set()与 get()方法。程序代码如下。

package com.autobean;public class Teacher {private String name;private int age;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}

创建教学档案类 TeachFile,定义 Teacher 和 Student 两个属性,并添加 print()方法。用于输出教师与学生的信息。程序代码如下。

package com.autobean;public class TeachFile {private Teacher teacher;private Student student;public TeachFile() {}public TeachFile(Teacher teacher, Student student) {this.teacher = teacher;this.student = student;}public Student getStudent() {return this.student;}public void setStudent(Student student1) {this.student = student1;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public void print() {System.out.println("------教师信息------");System.out.println("姓名:" + teacher.getName());System.out.println("年龄:" + teacher.getAge());System.out.println("性别:" + teacher.getSex());System.out.println();System.out.println("------学生信息------");System.out.println("学号:" + student.getID());System.out.println("姓名:" + student.getName());System.out.println("年龄:" + student.getAge());System.out.println("性别:" + student.getSex());}}

在配置文件applicationContext.xml中定义刚刚创建的类,并为其赋值。其中 TeachFile 类采用了自动装配。程序代码如下。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id="student" class="com.autobean.Student"><property name="ID" value="80" /> <property name="name" value="阿王" /> <property name="age" value="23" /> <property name="sex" value="男" /> </bean><bean id="teacher" class="com.autobean.Teacher"><property name="name" value="何老师" /> <property name="age" value="43" /> <property name="sex" value="女" /> </bean><!-- 默认情况下,通过'ref’来装配bean --><bean id="teachFile1" class="com.autobean.TeachFile" ><property name="teacher" ref="teacher" /><property name="student" ref="student" /></bean><!--根据byName自动装配bean --><bean id="teachFile2" autowire="byName"  class="com.autobean.TeachFile" /><!--根据byType自动装配bean --><bean id="teachFile3" autowire="byType" class="com.autobean.TeachFile" /><!--根据constructor自动装配bean --><bean id="teachFile4" autowire="constructor" class="com.autobean.TeachFile"/>
</beans>

在这个配置文件中定义了 Student 类和 Teacher 类,并为姓名、年龄和性别属性赋值。在定义 TeachFile 类时,没有传递任何参数,而是采用了 autowire 属性自动配置 TeachFile类所需要的属性。下面编写一个主类 PrintInfo 类来输出档案信息。程序代码如下。

package com.autobean;import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;public class PrintInfo {public static void main(String[] args) {Resource res = new ClassPathResource("applicationContext.xml");BeanFactory bf = new XmlBeanFactory(res);TeachFile tf1 = (TeachFile) bf.getBean("teachFile1");TeachFile tf2 = (TeachFile) bf.getBean("teachFile2");TeachFile tf3 = (TeachFile) bf.getBean("teachFile3");TeachFile tf4 = (TeachFile) bf.getBean("teachFile4");System.out.println("默认情况下,通过'ref’来装配bean");tf1.print();System.out.println("根据byName自动装配bean");tf2.print();System.out.println("根据byType自动装配bean");tf3.print();System.out.println("根据constructor自动装配bean");tf4.print();}}

输出结果:

四月 02, 2015 8:16:48 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
默认情况下,通过'ref’来装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女

------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据byName自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女

------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据byType自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女

------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据constructor自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女

------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男

在上面实例的配置文件 appContext.xml 中,TeachFile 类采用4种装配,将 Teacher
类和 Student 类注入到对应的属性中。语法格式如下。

<bean autowire="byName" id="teachFile" class="TeachFile" />

在 autowire 属性中指定类型为“byName”。autowire 属性共支持 5 种装配类型,下面
分别介绍每种装配类型的用法。
(1)no:autowire 采用的默认值,采用自动装配。必须使用 ref 直接引用其他 Bean,这样可以增加代码的可读性,并且不易出错。
(2)byName:以属性名区分自动装配。在容器中寻找与 JavaBean 的属性名相同的JavaBean,并将其自动装配到 JavaBean 中。如果用上面的实例来解释,TeachFile 类的实例对象 teachFile 包含的两个属性分别是 Teacher 类和 Student 类的实例对象,而配置文件中已经定义了这两个类的实例。在定义 teachFile 实例时指定了自动装配类型为“byName”,容器会自动寻找 teachFile 实例需要的属性(即 teacher 和 student 两个 JavaBean),并注入到 teachFile 实例中。此类自动装配类型存在错误装配 JavaBean 的可能,如果配置文件中定义了与需要自动装配的 JavaBean 属性相同而类型不同的 JavaBean,那么它会错误地注入不同类型的JavaBean。读者可以将上面实例中的配置文件修改一下,将 student 和 teacher 两个JavaBean 的类型保持不变,将名字调换一下,便会出现此问题。这时自动装配无法解决此问题,只能通过混合使用手动装配来指定装配哪个 JavaBean。
(3)byType:以属性类型区分自动装配。容器会自动寻找与 JavaBean 的属性类型相同的 JavaBean 的定义,并将其注入到需要自动装配的 JavaBean 中。如果将上面配置JavaBean 自动装配的类型修改为 byType,也可以实现相同的结果。这种自动装配类型也会出现无法自动装配的情况。例如在配置文件中再次添加一个Student 类或 Teacher 类的实现对象,byType 自动装配类型会因为无法自动识别装配哪一个 JavaBean 而抛出org.springframework.beans.factory.UnsatisfiedDependencyException 异常。要解决此
问题,只能通过混合使用手动装配来指定装配哪个 JavaBean。
(4)constructor:通过构造方法的参数类型自动装配。此类型会使容器自动寻找与JavaBean 的构造方法的参数类型相同的 Bean,并注入到需要自动装配的 JavaBean 中。它
与 byType 类型存在相同的无法识别自动装配的情况。
(5)autudetect:这是最后一个自动装配类型,它首先使用 constructor 方式自动装配,然后使用 byType 方式。当然它也存在与 byType 和 constructor 相同的异常情况。建

议在使用自动装配时,把容易出现问题的 JavaBean 使用手动装配注入依赖属性

本文工程免费下载

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

Spring之IOC自动装配解析相关推荐

  1. Spring之IOC自动装配

    7.Bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在spring中有三种装配的方式 在xml中显示的配置 在jav ...

  2. Spring中的自动装配和Autowired

    彻底搞明白Spring中的自动装配和Autowired 一.自动装配 当Spring装配Bean属性时,有时候非常明确,就是需要将某个Bean的引用装配给指定属性.比如,如果我们的应用上下文中只有一个 ...

  3. java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...

    详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...

  4. Spring Boot(一) 自动装配--约定大于配置

    欢迎去我的个人博客--晓坞坐坐,里面有很多有趣的文章,不止是技术.www.lixiaodongisme.com 随着spring体系的发展,我们在开发时需要配置整合的东西也越来越多,在进行开发时,繁琐 ...

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

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

  6. Spring精华问答 | Spring Bean的自动装配是怎么回事?

    戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...

  7. Spring按类型自动装配注入数组、集合、Map

    Spring按类型自动装配注入数组.集合.Map时,是把应用上下文中对应类型的bean装配进集合,而不是直接查找一个对应类型的集合然后注入.以下面这段代码为例: import org.springfr ...

  8. Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    http://moshowgame.iteye.com/blog/1607718 @Autowired自动装配 上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我们需 ...

  9. Spring自动装配解析

    set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.Spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean ...

  10. 《Spring中的自动装配》

    /*** 自动装配[装配自定义的组件,或者装配spring底层的一些组件为我所用(需要组件实现xxxAware接口)]* Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值: ...

最新文章

  1. 新信号!阿里 AI 工程师趋于年轻化,高端AI人才严重短缺
  2. phpstudy apache配置https
  3. 将论文中的所有参考文献编号批量上标化
  4. android获取mysql数据_java – Android从mySql获取数据
  5. hackerrank---Sets - Symmetric Difference
  6. VMware Ubuntu NAT上网方式配置
  7. ansible(4)——配置文件及以对面某个用户来登录
  8. 机器学习入门------pandas
  9. 一步一步理解GB、GBDT、xgboost
  10. linux内核3.6版本及以下的bug引发的故障--cpu使用率100%
  11. uva705--slash maze
  12. php面向对象之单表操作类
  13. 【动态规划】P1057 传球游戏
  14. ui uview 安卓开发_HarmonyOS 2.0手机开发者Beta公测招募
  15. 超简单的ubuntu下安装teamview教程
  16. VM14安装Mas os 13
  17. 富盛Sbo金税接口管理模块操作手册
  18. 潇洒老师分享的小知识:注塑模具“压模”的原因和预防措施
  19. uniapp获取手机可接收的所有的WiFi名称与信号强度
  20. 动态jsp页面转pdf项目示例

热门文章

  1. 一款完整的企业级CMS站群系统源码,采用了比较典型的三层架构技术,源码分享
  2. a星地图测试工具_A星算法地图编辑器
  3. POP3 SMTP 协议分析
  4. 设计模式-外观模式(家庭影院你值得拥有)
  5. 在自己的网站上实现QQ授权登录
  6. 学习网络的几本好书推荐
  7. idea的工具栏显示
  8. 问题——nvm use 出现exit status 1:乱码
  9. 阳离子型含糖水凝胶的合成
  10. 武汉大学 计算机学院 衰落,为何武汉大学每年都被黑,武汉大学真的没有实力吗?...