【Spring笔记05】Spring的自动装配

这篇文章,主要介绍的内容是Spring的自动装配、五种自动装配的方式。

目录

一、自动装配

1.1、什么是自动装配

1.2、五种自动装配方式

(1)no

(2)default

(3)byType

(4)byName

(5)constructor


一、自动装配

1.1、什么是自动装配

自动装配,是指:Spring自动的建立Bean对象和Bean对象之间的依赖关系,而不需要我们开发人员手动的进行设置,这个过程就叫做自动装配。

自动装配,其实就是和之前介绍的依赖注入是一样的,只不过我们进行依赖注入的时候,需要开发人员在XML配置文件里面,通过【<property>】标签或者【<constructor-arg>】标签,手动的进行属性赋值,可以想到,如果项目中有很多对象都需要赋值,那这样就需要编写许多的XML配置代码,这不利于XML配置文件的维护。为了能够简化一下依赖注入,所以就提出了自动装配的概念,目的就是让Spring自动的替我们给属性赋值,从而简化XML配置。

Spring中默认情况下,是没有开启自动装配的功能,如果我们需要使用自动装配,则需要通过在【<bean>】标签中添加【autowire】属性,然后设置采用哪种自动装配的方式,Spring提供了五种自动装配的方式,分别是:

  • no:表示不自动装配。
  • default:表示按照【<beans>】根标签上面配置的【default-autowire】方式进行自动装配。
  • byType:表示根据Bean的数据类型进行自动装配。(如果存在多个相同数据类型的Bean,则自动装配失败,抛出异常。)
  • byName:表示根据Bean的名称进行自动装配。(根据bean的id属性值进行属性,如果存在多个相同名称的id属性值,则抛出异常。)
  • constructor:表示通过构造方法进行自动装配。(根据Bean的构造方法进行自动装配,根据构造方法参数的数据类型进行属性赋值。)

下面通过一些案例,详细的介绍一下五种自动装配的内容。

1.2、五种自动装配方式

自动装配,我们需要在XML配置文件中对应的【<bean>】标签上面,通过设置【autowire】属性,来控制采用哪种方式进行自动装配。

(1)no

当我们设置【autowire="no"】的时候,此时表示Spring不会自动装配,Bean对象之间的依赖关系需要我们自己手动进行依赖注入,【autowire】默认的属性值就是no,下面通过一个案例来看看自动装配。

创建【UserDao】测试类

public class UserDao {public void create() {System.out.println("调用UserDao类的create()方法......");}}

创建【UserService】测试类

public class UserService {private UserDao userDao;public void test() {System.out.println("开始执行UserService类的test()方法......");// 这里调用 userDao 类中的 create() 方法userDao.create();System.out.println("执行结束");}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}

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"><!-- 配置 UserDao --><bean id="userDao" class="com.spring.demo.pojo.UserDao"/><!-- 配置 UserService --><bean id="userService" class="com.spring.demo.pojo.UserService" autowire="no"></bean></beans>

编写【Test】测试程序

public class Test {public static void main(String[] args) {// 1、获取 ApplicationContext 容器ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");// 2、获取 Bean 对象UserService userService = context.getBean("userService", UserService.class);// 调用方法userService.test();// 关闭容器: 这里通过关闭容器来模拟Bean被销毁的操作context.close();}
}

我们运行上面的测试程序,查看控制台输出。


运行结果会提示空指针异常,因为我们设置了【UserService】类【autowire="no"】表示不会自动装配当前类中的任何属性,所以我们在使用【UserDao】对象的时候,就会出现空指针异常。

(2)default

当我们设置【autowire="default"】时候,表示当前bean按照【<beans>】标签中【default-autowre】属性进行自动装配。


我们按照上面的配置方式,再次运行测试程序,此时就可以运行成功。


因为Spring会根据【byName】进行自动装配,在UserService类中存在userDao的Bean对象,Spring就会去查找当前IOC容器里面是否存在一个叫做【userDao】的对象,如果找到则将其赋值到UserService类里面的userDao属性,此时自动装配成功。

如果Spring没要找到userDao,或者找到多个userDao对象,那么就会抛出异常,自动装配失败。

(3)byType

byType表示根据数据类型进行自动装配,只需要设置【autowire="byType"】即可。下面看个测试案例,来看看byType自动装配的效果。

创建【Dao】接口

public interface Dao {void create();
}

创建【UserDao1】测试类

public class UserDao1 implements Dao {public void create() {System.out.println("调用UserDao1类的create()方法......");}
}

创建【UserDao2】测试类

public class UserDao2 implements Dao {public void create() {System.out.println("调用UserDao2类的create()方法......");}
}

创建【UserService2】测试类

public class UserService2 {private Dao dao;public void test() {System.out.println("开始执行UserService类的test()方法......");// 这里调用 dao 类中的 create() 方法dao.create();System.out.println("执行结束");}public Dao getDao() {return dao;}public void setDao(Dao dao) {this.dao = dao;}
}


XML配置上面的测试类对象

这里我们先配置一个【UserDao1】和【UserServce2】,然后运行测试程序查看结果。


运行测试程序,控制台可以正常输出。


但是,当我们Spring中存在多个相同数据类型的Bean对象时候,此时采用byType进行自动装配就会失败。下面我们将【UserDao2】类也配置到XML里面。


再次运行测试程序,可以发现控制台抛出异常。


上面报错信息大致意思是:预期一个匹配的Bean,但是找到了2个,分别是userDao1和userDao2。

(4)byName

byName和byType类型,只不过设置【autowire="byName"】的时候,是根据【<bean>】标签的【id】属性值进行自动装配。Spring会去查找是否存在【id】和当前类里面名称相同的属性,如果存在,则进行自动装配,如果有多个或者一个都没有,则自动装配失败。

测试类还是和前面一样,不一样的地方是XML配置。

我们将XML配置修改为如下内容。


通过上面的配置,我们就已经成功设置【autowire="byName"】自动装配了,运行测试程序,查看是否自动装配成功。


然后,我们在添加【UserDao2】的XML配置,此时配置了两个名称叫做dao的Bean对象,再次运行测试程序,就会抛出异常。


以上,就是通过byName进行自动装配,就记住:多个时候,Spring也不知道该赋值哪个,所以就会报错。 

(5)constructor

constructor自动装配是根据构造方法的参数数据类型实现的,根据Bean对象的构造方法中的参数数据类型,然后Spring框架会找到相同数据类型的Bean,通过构造方法进行赋值,和byType类似。

创建【UserDao3】测试类

public class UserDao3 {public void create() {System.out.println("调用UserDao3类的create()方法......");}
}

创建【UserService3】测试类

public class UserService3 {private UserDao3 userDao3;// 通过构造方法注入public UserService3(UserDao3 userDao3) {this.userDao3 = userDao3;}public void test() {System.out.println("开始执行UserService3类的test()方法......");// 这里调用 dao 类中的 create() 方法userDao3.create();System.out.println("执行结束");}
}

XML配置上面两个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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置 UserDao3 --><bean id="userDao3" class="com.spring.demo.pojo3.UserDao3"/><!-- 配置 UserService3 --><bean id="userService3" class="com.spring.demo.pojo3.UserService3"autowire="constructor"></bean></beans>

编写测试程序,查看控制台输出结果。

public class Test05 {public static void main(String[] args) {// 1、获取 ApplicationContext 容器ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring05.xml");// 2、获取 Bean 对象UserService3 userService = context.getBean("userService3", UserService3.class);// 调用方法userService.test();// 关闭容器: 这里通过关闭容器来模拟Bean被销毁的操作context.close();}
}

运行程序,控制台正常输出。


到此,Spring的自动装配的五种方式介绍完了,实际开发中,最常用的是【byType】、【byName】、【constructor】这三个,并且在之后的注解开发里面,都不会使用XML进行自动装配,而是采用【@Autowired】注解,这个注解就是默认采用【byType】进行自动装配的。


综上,这篇文章就结束啦,主要介绍的内容是Spring的自动装配、五种自动装配的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansys Optics Launcher 提升客户体验

概述 为了改善用户体验&#xff0c;Ansys Optics 团队开发了一个新的一站式启动应用程序&#xff0c;简化了工作流程并提高了效率。随着Ansys 2023 R2的最新更新&#xff0c;Ansys Optics Launcher 现已安装在Ansys Speos, Ansys Lumerical和Ansys Zemax OpticStudio中。作为一…

Docker之Dockerfile搭建lnmp

目录 一、搭建nginx ​编辑 二、搭建Mysql&#xff08;简略版&#xff09; 三、搭建PHP 五、补充 主机名ip地址主要软件mysql2192.168.11.22Docker 代码示例 systemctl stop firewalld systemctl disable firewalld setenforce 0docker network create --subnet172.18.…

OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击

作者&#xff1a;gentle_zhou 原文链接&#xff1a;OWASP Top 10漏洞解析&#xff08;3&#xff09;- A3:Injection 注入攻击-云社区-华为云 Web应用程序安全一直是一个重要的话题&#xff0c;它不但关系到网络用户的隐私&#xff0c;财产&#xff0c;而且关系着用户对程序的新…

Scala第十八章节

Scala第十八章节 scala总目录 文档资料下载 章节目标 掌握Iterable集合相关内容.掌握Seq集合相关内容.掌握Set集合相关内容.掌握Map集合相关内容.掌握统计字符个数案例. 1. Iterable 1.1 概述 Iterable代表一个可以迭代的集合, 它继承了Traversable特质, 同时也是其他集合…

K8S网络原理

文章目录 一、Kubernetes网络模型设计原则IP-per-Pod模型 二、Kubernetes的网络实现容器到容器的通信Pod之间的通信同一个Node内Pod之间的通信不同Node上Pod之间的通信 CNI网络模型CNM模型CNI模型在Kubernetes中使用网络插件 开源的网络组件FlannelFlannel实现图Flannel特点 Op…

pyppeteer 基本用法和案例

特点 自带chromium 不用自己下载也可以下载&#xff0c;比较省事.比selenium好用 可异步调用 简介 一. pyppeteer介绍 Puppeteer是谷歌出品的一款基于Node.js开发的一款工具&#xff0c;主要是用来操纵Chrome浏览器的 API&#xff0c;通过Javascript代码来操纵Chrome浏览器&am…

解密人工智能:决策树 | 随机森林 | 朴素贝叶斯

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、决策树2.1 优点2.2 缺点 三、随机森林四、Naive Bayes&#xff08;朴素贝叶斯&#xff09;五、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法&#xff0c;通过对…

Ubuntu 22.04 安装系统 手动分区 针对只有一块硬盘 lvm 单独分出/home

自动安装的信息 参考自动安装时产生的分区信息 rootyeqiang-MS-7B23:~# fdisk /dev/sdb -l Disk /dev/sdb&#xff1a;894.25 GiB&#xff0c;960197124096 字节&#xff0c;1875385008 个扇区 Disk model: INTEL SSDSC2KB96 单元&#xff1a;扇区 / 1 * 512 512 字节 扇区大…

【科研工具】-论文相关

科研工具 1 论文检索2 论文阅读3 论文写作4 论文发表 1 论文检索 计算机类英文文献检索数据库DBLP: 只有论文基本信息&#xff08;标题、作者等&#xff09;&#xff1b;下载论文&#xff1a;知网\IEEE\ACM\SCI-Hub等&#xff0c;记得创建文件夹&#xff08;检索词条、日期等&…

OpenAI重大更新!为ChatGPT推出语音和图像交互功能

原创 | 文 BFT机器人 OpenAI旗下的ChatGPT正在迎来一次重大更新&#xff0c;这个聊天机器人现在能够与用户进行语音对话&#xff0c;并且可以通过图像进行交互&#xff0c;将其功能推向与苹果的Siri等受欢迎的人工智能助手更接近的水平。这标志着生成式人工智能运动的一个显著…

websocket拦截

python实现websocket拦截 前言一、拦截的优缺点优点缺点二、实现方法1.环境配置2.代码三、总结现在的直播间都是走的websocket通信,想要获取websocket通信的内容就需要使用websocket拦截,大多数是使用中间人代理进行拦截,这里将会使用更简单的方式进行拦截。 前言 开发者工…

Unity2D创建帧动画片段

文章目录 概述为角色创建动画Animator组件创建动画片段状态转移 其他文章 概述 动画是游戏中一种使对象表现出运动或变换的方式。当涉及到动画时&#xff0c;我们通常就会用到Animator组件。它允许我们在Unity编辑器中创建、管理和控制这些动画&#xff0c;并将其应用于游戏对…

JTAG/SWD接口定义

目录 1. ST-Link接口定义 2. ULINK2接口定义 为方便查阅&#xff0c;将ST-LINK和ULINK的JTAG和SWD接口定义总结如下&#xff1a; 1. ST-Link接口定义 Pin no. ST-LINK/V2 connector (CN3) ST-LINK/V2 function Target connection (JTAG) Target connection (SWD) 1 VA…

移动硬盘数据恢复怎么做?盘点4种实用恢复方法!

“为了存储我的照片和视频&#xff0c;我特地买了一个大容量的移动硬盘。但是不知道我在导照片的时候是不是误操作了&#xff0c;很多照片和视频都丢失了&#xff0c;我应该怎么恢复移动硬盘里的数据呀&#xff1f;” 移动硬盘方便携带且容量比较大&#xff0c;逐渐成了很多朋友…

聚焦酷开科技智能大屏OS Coolita,打造智能推荐服务能力全景

2023年9月18日—22日&#xff0c;科学和教育计算机协会The Association for Computing Machinery&#xff08;ACM&#xff09;在新加坡举办了为期5天的ACM RecSys 2023&#xff0c;云集了各大品牌的科技巨头技术人员&#xff0c;还有中外各大高等学府学者参与其中&#xff0c;共…

机器人革命:你一定没见过这些全新的机器人技术!

原创 | 文 BFT机器人 01 通过机器人协作推进危险测绘 在危险测绘领域&#xff0c;研究人员开发了一种合作方案&#xff0c;利用地面和空中机器人对污染区域进行危险测绘。该团队通过使用异构覆盖控制技术提高了密度图的质量并降低了误差。与同质替代方案相比&#xff0c;该策…

【ARM】(1)架构简介

前言 ARM既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。 ARM公司是专门从事基于RISC技术芯片设计开发的公司&#xff0c;作为知识产权&#xff08;IP&#xff09;供应商&#xff0c;本身不直接从事芯片生产…

009:获取20日均线数据

再《005》中我们获得了K线数据&#xff0c;现在我们要把他的20日均线数据也获取出来。然后通过计算后&#xff0c;保存在新的一列中&#xff1a; import pandas as pd import tkinter as tk from tkinter import filedialog import ospathdef open_file():global pathpath fi…

1.5 JAVA程序运行的机制

**1.5 Java程序的运行机制** --- **简介&#xff1a;** Java程序的运行涉及两个主要步骤&#xff1a;编译和运行。这种机制确保了Java的跨平台特性。 **主要内容&#xff1a;** 1. **Java程序的执行过程**&#xff1a; - **编译**&#xff1a;首先&#xff0c;扩展名为.jav…

VMware 17pro安装流程附带密钥手把手教

VMware 17pro centos-8.5.2111-isos-x86_64安装包下载_开源镜像站-阿里云 安装VMware 17pro 下一步 勾选我接营许可协议中的条款点击下一步 更改路径后点击下一步 注意两个都要取消勾选不然会自动更新 下一步即可 最后一步为安装就行&#xff08;我电脑上有VMware 16pro所以我的…