§1 什么是自动装配?

Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。

简而言之,就是对于bean当中引用的其他bean不需要我们自己去配置它改使用哪个类,Spring 的自动装配可以帮助我们完成这些工作。

§2 自动装配的意义?
引用
理解自动装配的优缺点是很重要的。其中优点包括:

自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。

自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
§3 自动装配有几种类型?

 
5种模式 说明 

通过配置default-autowire 属性,Spring IOC 容器可以自动为程序注入bean;默认是no,不启用自动装配;
default-autowire 的类型有byName,byType,constructor;
byName:通过名称进行自动匹配;
byType:根据类型进行自动匹配;
constructor:和byType 类似,只不过它是根据构造方法注入而言的,根据类型,自动注入;

byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自
动装配。例如,在bean定义中将 autowire设置为by name,而该bean包含master属性(同时提供
setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的
bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,
则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置
dependency-check="objects"让Spring抛出异常。

constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类
型一致的bean,那么将会抛出异常。

autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。
如果发现默认的构造器,那么将使用byType方式。

建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"
  6. default-autowire="byName">
  7. <bean id="car2" class="com.zhiqi.model.Car">
  8. <property name="id" value="2007"></property>
  9. <property name="carName" value="奥迪"></property>
  10. </bean>
  11. <!-- 自动装配 byName 来找car -->
  12. <bean id="car" class="com.zhiqi.model.Car">
  13. <property name="id" value="2009"></property>
  14. <property name="carName" value="奥拓"></property>
  15. </bean>
  16. <bean id="employee" class="com.zhiqi.model.Employee">
  17. <property name="id" value="10080"></property>
  18. <property name="name" value="贾经理"></property>
  19. <property name="sex" value="男"></property>
  20. </bean>
  21. </beans>
  1. public class Car {
  2. private int id;
  3. private String carName;
  4. public int getId() {
  5. return id;
  6. }
  7. public void setId(int id) {
  8. this.id = id;
  9. }
  10. public String getCarName() {
  11. return carName;
  12. }
  13. public void setCarName(String carName) {
  14. this.carName = carName;
  15. }
  16. }
  1. public class Employee {
  2. private int id;
  3. private String name;
  4. private String sex;
  5. private Car car;
  6. public Employee() {
  7. super();
  8. // TODO Auto-generated constructor stub
  9. }
  10. public Employee(int id, String name, String sex) {
  11. super();
  12. this.id = id;
  13. this.name = name;
  14. this.sex = sex;
  15. }
  16. public int getId() {
  17. return id;
  18. }
  19. public void setId(int id) {
  20. this.id = id;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getSex() {
  29. return sex;
  30. }
  31. public void setSex(String sex) {
  32. this.sex = sex;
  33. }
  34. public Car getCar() {
  35. return car;
  36. }
  37. public void setCar(Car car) {
  38. this.car = car;
  39. }
  40. }

public class MyTest {

  1. public static void main(String[] args) {
  2. ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
  3. Employee employee=(Employee)ac.getBean("employee");
  4. //employee.setName("李经理");//在xml中属性注入
  5. System.out.println(employee.getCar().getCarName());
  6. }
  7. }

【byType】

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"
  6. default-autowire="byType">
  7. <!-- 自动装配 byType 有两个相同类型会报错 -->
  8. <bean id="car2" class="com.zhiqi.model.Car">
  9. <property name="id" value="2007"></property>
  10. <property name="carName" value="奥迪"></property>
  11. </bean>
  12. <!-- 自动装配 byType 来找car -->
  13. <bean id="car" class="com.zhiqi.model.Car">
  14. <property name="id" value="2009"></property>
  15. <property name="carName" value="奥拓"></property>
  16. </bean>
  17. <bean id="employee" class="com.zhiqi.model.Employee">
  18. <property name="id" value="10080"></property>
  19. <property name="name" value="贾经理"></property>
  20. <property name="sex" value="男"></property>
  21. </bean>
  22. </beans>

测试:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
  4. Employee employee=(Employee)ac.getBean("employee");
  5. //employee.setName("李经理");//在xml中属性注入
  6. System.out.println(employee.getCar().getCarName());
  7. }
  8. }

运行:

【default-autowire="constructor"】

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd"
  6. default-autowire="constructor">
  7. <!-- 自动装配 constructor 需要写单参构造方法 -->
  8. <bean id="car3" class="com.zhiqi.model.Car">
  9. <property name="id" value="2007"></property>
  10. <property name="carName" value="奥迪"></property>
  11. </bean>
  12. <bean id="employee" class="com.zhiqi.model.Employee">
  13. <property name="id" value="10080"></property>
  14. <property name="name" value="贾经理"></property>
  15. <property name="sex" value="男"></property>
  16. </bean>
  17. </beans>

    1. 自动装配 constructor 需要写单参构造方法

转载自:

Spring4自动装配(default-autowire)的更多相关文章

  1. Spring笔记04(DI(给属性赋值),自动装配(autowire))

    给不同数据类型注入值: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  2. Spring4自动装配(default-autowire) (转)

    原文地址:http://blog.csdn.net/conglinyu/article/details/63684957 Spring 自动装配 通过配置default-autowire 属性,Spr ...

  3. [转载]Spring Autowire自动装配介绍

    转自: http://www.cnblogs.com/zhishan/p/3190757.html 在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型 ...

  4. Spring Autowire自动装配介绍

    在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的< ...

  5. Spring Autowire自动装配

    在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的< ...

  6. Spring学习记录(三)---bean自动装配autowire

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...

  7. Spring 自动装配及其注解

    一.属性自动装配 首先,准备三个类,分别是User,Cat,Dog.其中User属性拥有Cat和Dog对象. package com.hdu.autowire; public class User { ...

  8. spring的自动装配(default-autowire="byName")

    自动装配,官方给出的定义是这样:Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自 动让Spring通过检查BeanFactory中的内 ...

  9. Spring(三)之自动装配、表达式

    自动装配 自动装配(autowire)协作者 Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自动让Spring通过检查BeanFact ...

随机推荐

  1. 通过编写聊天程序来熟悉python中多线程及socket的用法

    1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...

  2. Wannafly挑战赛9 E - 组一组

    链接:https://www.nowcoder.net/acm/contest/71/E来源:牛客网 题目描述 有一个长为 n 的数列 A,其中有 m 个限制条件,条件有两种: 1.对于区间 [l,r ...

  3. HTML5之新增的属性和废除的属性 (声明:内容节选自《HTML 5从入门到精通》)

    新增的属性 1.表单相关的属性 ———————————————————————————————————————————————————————— •autocomplete 属性 autocomple ...

  4. Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) SyntaxError: Unexpected token R in JSON at position 0 at JSON.parse (<anonymous>)

    这个问题在之前做项目时碰到过一次,当时按照网上的做法,去掉JSON.parse()这一层转换后就没有这个报错了,数据也能正常使用,就没多想,也没深究是什么原因.可是这次又碰到了,所以这次我必须要弄明白 ...

  5. sql中 设置区分大小写

    CI 指定不区分大小写,CS 指定区分大小写alter table 表名 alter column 字段 nvarchar(100) collate chinese_prc_cs_as --区分大小写 ...

  6. Android开发时,那些相见恨晚的工具或网站!

    本文来我在知乎话题Android开发时你遇到过什么相见恨晚的工具或网站?下的回答! 在实际Android开发过程确实会有很多相见恨晚的工具或网站出现,下面是我自己的一些分享. 1.源码网站 https ...

  7. Android TextEdit属性

    EditText继承关系:View-->TextView-->EditText 去掉边框 将EditText属性设置修改 android:background="@null&qu ...

  8. idea 自动导入包设置

  9. Vue2学习笔记:class和style

    1.用法 <!DOCTYPE html> <html> <head> <title></title> <meta charset=&q ...

  10. Vue2学习笔记:事件对象、事件冒泡、默认行为

    1.事情对象 <!DOCTYPE html> <html> <head> <title></title> <meta charset= ...