一、什么是自动装配

1、自动装配是使用spring满足bean依赖的一种方法

2、spring会在应用上下文中为某个bean寻找其依赖的bean。

二、自动装配的方法有哪些

1、在xml中显式配置;

2、在java中显式配置;

3、隐式的bean发现机制和自动装配。

三、学习环境的搭建

1、创建三个实体类

Dog,Cat,People

package com.lisi.pojo;public class Dog {public void shout(){System.out.println("汪汪汪");}
}
package com.lisi.pojo;public class Cat {public void shout(){System.out.println("喵喵喵");}
}
package com.lisi.pojo;public class People {private Cat cat;private Dog dog;private String name;public Cat getCat() {return cat;}public void setCat(Cat cat) {this.cat = cat;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';}
}

编写beans.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog" class="com.lisi.pojo.Dog"/><bean id="cat" class="com.lisi.pojo.Cat"/><bean id="people" class="com.lisi.pojo.People"><property name="cat" ref="cat"/><property name="dog" ref="dog"/><property name="name" value="haha"/></bean>
</beans>

编写测试类

import com.lisi.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {@Testpublic void Test01(){ApplicationContext context = new   ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people",People.class);people.getCat().shout();people.getDog().shout();}
}

测试运行:

运行成功

四、自动装配的学习

1、byName(按名称自动装配)

将beans.xml中的bean改为如下内容:

修改bean配置,增加一个属性  autowire="byName"

<bean id="cat" class="com.lisi.pojo.Cat"></bean>
<bean id="dog" class="com.lisi.pojo.Dog"></bean>
<bean id="people" class="com.lisi.pojo.People" autowire="byName"></bean>

再次测试依旧可以正常输出。

如果此时将id=cat改为id=cat1;

再次测试, 执行时报空指针java.lang.NullPointerException;则无法正常输出。

总结:

当一个bean节点带有 autowire byName的属性时。

将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat;

去spring容器中寻找是否有此字符串名称id的对象。

如果有,就取出注入;如果没有,就报空指针异常。

2、byType(按类型自动装配)

将beans.xml中的bean改为如下内容:

修改bean配置,增加一个属性  autowire="byType"

<bean id="cat" class="com.lisi.pojo.Cat"></bean>
<bean id="dog" class="com.lisi.pojo.Dog"></bean>
<bean id="people" class="com.lisi.pojo.People" autowire="byType"></bean>

再次测试依旧可以正常输出。

若果在配置中再加一条:

<bean id="cat1" class="com.lisi.pojo.Cat"></bean>

测试,报错:NoUniqueBeanDefinitionException

注意:使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

3、注解

jdk1.5开始支持注解,spring2.5开始全面支持注解。

在beans.xml中导入注解支持:

xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

开启注解支持:

<context:annotation-config/>

(1)@Autowired

在people实体类中加入注解:

 @Autowiredprivate Cat cat;@Autowiredprivate Dog dog;

配置beans.xml

<bean id="cat" class="com.lisi.pojo.Cat"></bean>
<bean id="dog" class="com.lisi.pojo.Dog"></bean>
<bean id="people" class="com.lisi.pojo.People" ></bean>

测试可以正常运行

注意:

@Autowired(required=false)  说明:false,对象可以为null;true,对象必须存对象,不能为null。

@Qualifier不可以单独使用

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

@Qualifier(value = "cat2")

(2)@Resource

实体类:

public class User {//如果允许对象为null,设置required = false,默认为true@Resource(name = "cat2")private Cat cat;@Resourceprivate Dog dog;private String str;
}
  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;

  • 其次再进行默认的byName方式进行装配;

  • 如果以上都不成功,则按byType的方式自动装配。

  • 都不成功,则报异常。

@Autowired与@Resource异同:

1、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

3、@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

Spring 自动装配详细讲解相关推荐

  1. 学习篇(一)- Spring自动装配的方式

    Spring自动装配的方式 1. 什么是自动装配? ​ 自动装配就是会通过Spring 的上下文为你找出相应依赖项的类,通俗的说就是Spring 会在上下文中自动查找,并自动给Bean装配与其相关的属 ...

  2. Spring 自动装配 ‘byType’

    转载自   Spring 自动装配 'byType' Spring 自动装配 'byType' 这种模式由属性类型指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans ...

  3. Spring 自动装配 ‘byName’

    转载自  Spring 自动装配 'byName' Spring 自动装配 'byName' 这种模式由属性名称指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans 的 ...

  4. spring自动装配依赖包_解决Spring自动装配中的循环依赖

    spring自动装配依赖包 我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践. 使用Spring编写企业Web应用程序时,服务层中的服务量可能会增加. 服务层中的每个服务可能会消耗其他服 ...

  5. Java的注解机制——Spring自动装配的实现原理

    JDK1.5加入了对注解机制的支持,实际上我学习Java的时候就已经使用JDK1.6了,而且除了@Override和@SuppressWarnings(后者还是IDE给生成的--)之外没接触过其他的. ...

  6. Spring自动装配----注解装配----Spring自带的@Autowired注解

    Spring自动装配----注解装配----Spring自带的@Autowired注解 父类 package cn.ychx;public interface Person {public void ...

  7. spring自动装配、注解

    spring自动装配 Spring 自动装配 byName 这种模式由属性名称指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 ...

  8. Spring自动装配(autowire)篇

    什么是自动装配 自动装配帮我们省去了 property标签配置操作,Spring会自动根据 属性名称,类型,构造器来进行自动注入. 例如不进行自动装配配置如下: <bean id="u ...

  9. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

最新文章

  1. 找Java培训机构有哪些评判标准
  2. js 定时网页点击_JS的小乐趣:轻松完成打地鼠游戏
  3. Java异常处理和设计
  4. Java基础语法 第2节 Java语言基本语法
  5. linux的gromacs模拟分子运动,分子动力学技术交流---gromacsamber
  6. 【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题
  7. 返回表达式列表中最小值least(exp1,exp2,exp3,……,expn)
  8. python中while的用法_Python学习笔记之While循环用法分析
  9. [设计模式-结构型]适配器(Adapter)
  10. 第18天:京东网页头部制作
  11. 一个数的约数(个数。约数和)
  12. Redis无法保存ef复杂对象
  13. expert php and mysql_Expert PHP and Mysql
  14. python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列
  15. python爬股指期货数据_股指期货高频数据机器学习预测
  16. 二叉平衡树(C++)
  17. matlab画图时特殊符号的输入
  18. 大一作业HTML网页作业:中华传统文化题材网页设计(纯html+css实现)科普网
  19. uni-app报错 cid unmatched at view.umd.min.js:1解决方案
  20. 全排列的递归算法(C语言)

热门文章

  1. 检索Windows系统已安装补丁的方法
  2. 【设计模式】——六芒星
  3. 扎西拉姆·多多的《见与不见》
  4. 多普达、HTC的来龙去脉(手机开发)
  5. windows server 2016 配置DHCP
  6. python 汉诺塔编程看不懂,简单理解汉诺塔递归问题(Python)
  7. Drools入门介绍
  8. matlab 微积分计算 自用1
  9. CISCO 零日漏洞 CVE-2016-6415,由NSA方程组泄露档案中探得
  10. 缺省(默认)VLAN