目录

  • 自动装配
    • Spring支持5种自动装配模式
    • 演示自动装配
      • 1. no 默认装配方式
      • 2.使用 byName 自动装配
      • 3.使用 byType 自动装配
      • 4.使用 constructor 自动装配
      • 5.使用 autodetect 自动装配(此方法spring3.0的时候被废除了)
    • 使用注解实现自动装配
      • 使用@Autowired注解
      • 使用@Resource注解

自动装配

自动装配是Spring满足bean依赖的一种方式
Spring会在上下文中自动查找,并自动给bean装配与其关联的属性

Spring支持5种自动装配模式

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

  • buName——根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配

  • byType——根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配

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

  • autodetect ——如果有默认构造器,则以constructor方式进行装配,否则以byType方式进行装配( spring3.0被废除了)

演示自动装配

首先,准备三个类,分别是People,Cat,Dog。其中People属性拥有Cat和Dog对象。
Cat

package com.it04.pojo;public class Cat {public void shout(){System.out.println("喵喵~");}
}

Dog

package com.it04.pojo;public class Dog {public void shout(){System.out.println("汪汪~");}
}

People

package com.it04.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 + '\'' +'}';}
}

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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><!--    默认情况下,需要通过'ref’来装配bean--><bean id="people" class="com.it04.pojo.People"><property name="name" value="浩宇"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean></beans>

测试

import com.it04.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");People people = (People) context.getBean("people");people.getDog().shout();people.getCat().shout();}
}

2.使用 byName 自动装配

根据属性Cat与Dog的名字装配bean,通过People设置autowire=“byName”,Spring会自动寻找与属性名字相同的bean,找到后,通过调用set方法将其注入属性。

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><!--byName: 会自动在容器上下文中查找,和自己对象set方法否吗的值对应的bean id;byName,需要保证所有bean的id唯一,并且这个bane需要和自动注入的属性的set方法的值一致--><bean id="people" class="com.it04.pojo.People" autowire="byName"><property name="name" value="浩宇"/></bean></beans>

3.使用 byType 自动装配

根据属性Property的数据类型自动装配,通过People设置autowire=“byType”,Spring会总动寻找与属性类型相同的bean,找到后,通过调用set将其注入。

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><!--byType: 会自动在容器上下文中查找,和自己对象属性类型相同的bean;byTyoe,需要保证所有bean的class唯一,并且这个bane需要和自动注入的属性类型一致--><bean id="people" class="com.it04.pojo.People" autowire="byType"><property name="name" value="浩宇"/></bean></beans>

如果配置文件中有两个类型相同的bean
将抛出NoUniqueBeanDefinitionException异常:
No qualifying bean of type ‘com.it04.pojo.Cat’ available: expected single matching bean but found 2: cat,cat2

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

4.使用 constructor 自动装配

Spring会寻找与参数数据类型相同的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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><!--    Spring会寻找与参数数据类型相同的bean,通过构造函数将其注入。--><bean id="people" class="com.it04.pojo.People" autowire="constructor"><property name="name" value="浩宇"/></bean></beans>

5.使用 autodetect 自动装配(此方法spring3.0的时候被废除了)

Spring会先寻找People中是否有默认的构造函数,如果有相当于上面的’constructor’这种情况,用构造函数注入,否则,用’byType’这种方式注入。

spring3.0的时候就废除了

使用注解实现自动装配

  1. 首先导入约束
xmlns:context="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
</beans>
  1. 配置注解的支持
    <context:annotation-config/>

使用@Autowired注解

在People实体类的属性上使用
也可以在set方法上使用
使用@Autowired就可以不用编写Set方法了,前提是自动装配的属性在IOC容器中存在,且符合byname

package com.it04.pojo;import org.springframework.beans.factory.annotation.Autowired;public class People {@Autowiredprivate Cat cat;@Autowiredprivate 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 + '\'' +'}';}
}

在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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--  开启注解的支持  --><context:annotation-config/><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><bean id="people" class="com.it04.pojo.People"/></beans>

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个@Autowired完成,就可以使用@Qualifier(value=“xxx”)去配置@Autowired的使用,指定一个唯一的bean对象注入
比如:
有多个Cat与Dog

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--  开启注解的支持  --><context:annotation-config/><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><bean id="cat2" class="com.it04.pojo.Cat"/><bean id="dog22" class="com.it04.pojo.Dog"/><bean id="people" class="com.it04.pojo.People"/></beans>

此时就需要@Qualifier注解来配合@Autowired使用

package com.it04.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;public class People {@Autowired@Qualifier(value = "cat2")private Cat cat;@Autowired@Qualifier(value = "dog22")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 + '\'' +'}';}
}

使用@Resource注解

@Resource是一个组合注解
只要找到属性名字相同的bean或者找到与参数数据类型相同的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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--  开启注解的支持  --><context:annotation-config/><!--  只要找到属性名字相同的bean  --><bean id="cat" class="com.it04.pojo.Cat"/><bean id="dog" class="com.it04.pojo.Dog"/><bean id="cat2" class="com.it04.pojo.Cat"/><bean id="dog22" class="com.it04.pojo.Dog"/><!--  或者找到与参数数据类型相同的bean并且数据类型是唯一的  --><bean id="cat324324" class="com.it04.pojo.Cat"/><bean id="dog5235" class="com.it04.pojo.Dog"/><bean id="people" class="com.it04.pojo.People"/></beans>

@Resource也可以像@Qualifier(value=“xxx”)一样将value换成了name,指定一个唯一的bean对象注入

package com.it04.pojo;import javax.annotation.Resource;public class People {@Resource(name = "cat2")private Cat cat;@Resource(name = "dog22")private Dog dog;private String name;

Spring—自动装配与注解自动装配相关推荐

  1. 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?

    写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...

  2. spring框架学习(一):Bean的装配方式 ——基于注解的装配、自动装配

    Bean的装配方式 基于注解装配 常用注解: 总结 自动装配 [序言] 在前面的例子中我们就可以看到了使用基于XML方式的缺点了:如果应用中有较多的Bean对象,则会导致xml文件过于臃肿,给后续的维 ...

  3. [Spring实战系列](13)使用注解自动装配

    1. 简介 从Spring2.5开始,我们就可以使用注解的自动装配方式装配Spring Bean的属性.使用注解自动装配方式与在XML中使用autowire属性自动装配没有太大区别.那为啥还要研发出这 ...

  4. spring二:装配bean(自动装配)

    创建应用对象之间协作关系的行为通常称为装配(wiring),这就是依赖注入(DI)的本质. Spring提供了三种主要的装配机制: 1. 在xml中进行显式配置.  2. 在java中进行显式配置. ...

  5. 【SpringBoot】Spring手动装配和SpringBoot自动装配

    文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...

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

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

  7. springboot 自动装配_Spring Boot 自动装配流程

    Spring Boot 自动装配流程 本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程. Spring Boot 发现自动配置类 这 ...

  8. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...

  9. JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

    Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring?  Spring是分层的Java ...

最新文章

  1. Python基础01-Python环境搭建与HelloWorld
  2. Spring Boot(四)Accessing application arguments
  3. Git 自救指南:这些坑你都跳得出吗?
  4. IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
  5. 理解正向代理与反向代理的区别
  6. 新内容、新交互、新增长:视频云为短视频及电商直播行业高效赋能
  7. 让你觉得破坏了封装性的扩展方法
  8. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
  9. go语言的range使用
  10. 浅谈工业无线遥控器的基本定义及原理
  11. Python杂谈: __init__.py的作用
  12. Ubuntu 无法获得锁
  13. 如歌将两个数组合并_将数组数据拆分后再合并,作为字典的键,实现多条件数据汇总...
  14. scipy.special —— 排列、组合与阶乘
  15. HALCON示例程序IC.hdev通过电路板元器件定位识别
  16. Android network框架分析之NetworkManagementService和netd交互深入分析(二)
  17. matlab if语句小于等于,matlab的if语句运算符与或怎么用
  18. linux设置默认mbr,将默认 EC2 CentOS MBR 转换为 GPT 以绕过 2TiB 限制
  19. 逆转ACE《逆转裁判3》中文汉化版发布!
  20. ActionScript 3.0 杂乱笔记3

热门文章

  1. android 录制屏幕 带声音 可直播方案 截屏
  2. 关于达梦数据库备份恢复无法恢复,及备份恢复后启库无法启动,遇见的dmap(管道)问题
  3. Oracle v12.2 Bug 27163928触发ORA-4031 导致实例crash.
  4. Android Studio SSL peer shut down incorrectly
  5. 微服务架构设计实践系列之九:应用架构
  6. 下列属于计算机网络主要性能指标的有( ),下列属于计算机网络性能指标的有A.速率B.带宽C.时延D.误码率...
  7. Kafka命令及相关参数解释
  8. 手机无网状态下获取经纬度,离线定位的方法。
  9. 【若泽大数据001】Linux基础知识汇总
  10. 关于屏幕尺寸引起的问题