Spring—自动装配与注解自动装配
目录
- 自动装配
- 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的时候就废除了
使用注解实现自动装配
- 首先导入约束
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>
- 配置注解的支持
<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—自动装配与注解自动装配相关推荐
- 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?
写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...
- spring框架学习(一):Bean的装配方式 ——基于注解的装配、自动装配
Bean的装配方式 基于注解装配 常用注解: 总结 自动装配 [序言] 在前面的例子中我们就可以看到了使用基于XML方式的缺点了:如果应用中有较多的Bean对象,则会导致xml文件过于臃肿,给后续的维 ...
- [Spring实战系列](13)使用注解自动装配
1. 简介 从Spring2.5开始,我们就可以使用注解的自动装配方式装配Spring Bean的属性.使用注解自动装配方式与在XML中使用autowire属性自动装配没有太大区别.那为啥还要研发出这 ...
- spring二:装配bean(自动装配)
创建应用对象之间协作关系的行为通常称为装配(wiring),这就是依赖注入(DI)的本质. Spring提供了三种主要的装配机制: 1. 在xml中进行显式配置. 2. 在java中进行显式配置. ...
- 【SpringBoot】Spring手动装配和SpringBoot自动装配
文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...
- java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...
详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...
- springboot 自动装配_Spring Boot 自动装配流程
Spring Boot 自动装配流程 本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程. Spring Boot 发现自动配置类 这 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...
- JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试
Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的Java ...
最新文章
- Python基础01-Python环境搭建与HelloWorld
- Spring Boot(四)Accessing application arguments
- Git 自救指南:这些坑你都跳得出吗?
- IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
- 理解正向代理与反向代理的区别
- 新内容、新交互、新增长:视频云为短视频及电商直播行业高效赋能
- 让你觉得破坏了封装性的扩展方法
- 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
- go语言的range使用
- 浅谈工业无线遥控器的基本定义及原理
- Python杂谈: __init__.py的作用
- Ubuntu 无法获得锁
- 如歌将两个数组合并_将数组数据拆分后再合并,作为字典的键,实现多条件数据汇总...
- scipy.special —— 排列、组合与阶乘
- HALCON示例程序IC.hdev通过电路板元器件定位识别
- Android network框架分析之NetworkManagementService和netd交互深入分析(二)
- matlab if语句小于等于,matlab的if语句运算符与或怎么用
- linux设置默认mbr,将默认 EC2 CentOS MBR 转换为 GPT 以绕过 2TiB 限制
- 逆转ACE《逆转裁判3》中文汉化版发布!
- ActionScript 3.0 杂乱笔记3
热门文章
- android 录制屏幕 带声音 可直播方案 截屏
- 关于达梦数据库备份恢复无法恢复,及备份恢复后启库无法启动,遇见的dmap(管道)问题
- Oracle v12.2 Bug 27163928触发ORA-4031 导致实例crash.
- Android Studio SSL peer shut down incorrectly
- 微服务架构设计实践系列之九:应用架构
- 下列属于计算机网络主要性能指标的有( ),下列属于计算机网络性能指标的有A.速率B.带宽C.时延D.误码率...
- Kafka命令及相关参数解释
- 手机无网状态下获取经纬度,离线定位的方法。
- 【若泽大数据001】Linux基础知识汇总
- 关于屏幕尺寸引起的问题