依赖自动装配

news2024/11/24 17:56:30

自动配置  

前面花了大量的时间把Spring的注入去学习了下,总结起来就一个字麻烦

问:麻烦在哪?

答:配置文件的编写配置上。

问:有更简单方式么?

答:有,自动配置

什么是自动配置以及如何实现自动配置,就是接下来要学习的内容:

什么是依赖自动装配?  

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

自动装配方式有哪些?  

  • 按类型(常用)
  • 按名称
  • 按构造方法
  • 不启用自动装配

准备下案例环境  

创建一个Maven项目
pom.xml添加依赖
resources下添加spring的配置文件

这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:

 (1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类

1 public interface BookDao {

2     public void save();

3 }

4  

5 public class BookDaoImpl implements BookDao {

6     

7     private String databaseName;

8     private int connectionNum;

9     

10     public void save() {

11         System.out.println("book dao save ...");

12     }

13 }

14 public interface BookService {

15     public void save();

16 }

17  

18 public class BookServiceImpl implements BookService{

19     private BookDao bookDao;

20  

21     public void setBookDao(BookDao bookDao) {

22         this.bookDao = bookDao;

23     }

24  

25     public void save() {

26         System.out.println("book service save ...");

27         bookDao.save();

28     }

29 }

(2)resources下提供spring的配置文件

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 

http://www.springframework.org/schema/beans/spring-beans.xsd">

5  

6     <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

7     <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">

8         <property name="bookDao" ref="bookDao"/>

9     </bean>

10 </beans>

(3)编写AppForAutoware运行类,加载Spring的IOC容器,并从中获取对应的bean对象

1 public class AppForAutoware {

2     public static void main( String[] args ) {

3         ApplicationContext ctx = new 

ClassPathXmlApplicationContext("applicationContext.xml");

4         BookService bookService = (BookService) ctx.getBean("bookService");

5         bookService.save();

6     }

7 }

完成自动装配的配置  

接下来,在上面这个环境中来完成 自动装配 的学习:

自动装配只需要修改applicationContext.xml配置文件即可:

(1)将<property>标签删除

(2)在<bean>标签中添加autowire属性

首先来实现按照类型注入的配置

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 

http://www.springframework.org/schema/beans/spring-beans.xsd">

5  

6     <bean class="com.itheima.dao.impl.BookDaoImpl"/>

7     <!--autowire属性:开启自动装配,通常使用按类型装配-->

8     <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" 

autowire="byType"/>

9  

10 </beans>

 注意事项:

  • 需要注入属性的类中对应属性的setter方法不能省略
  • 被注入的对象必须要被Spring的IOC容器管理
  • 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为:

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 

http://www.springframework.org/schema/beans/spring-beans.xsd">

5  

6     <bean class="com.itheima.dao.impl.BookDaoImpl"/>

7     <!--autowire属性:开启自动装配,通常使用按类型装配-->

8     <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" 

autowire="byName"/>

9  

10 </beans>

注意事项:

按照名称注入中的名称指的是什么?

bookDao是private修饰的,外部类无法直接方法

外部类只能通过属性的set方法进行访问

对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名

  • 为什么是去掉set首字母小写?
  • 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名

 必须要有settle方法 

所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对
应的名是一致的

如果按照名称去找对应的bean对象,找不到则注入Null

当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

两种方式介绍完后,以后用的更多的是按照类型注入。

最后对于依赖注入,需要注意一些其他的配置特征:

1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推

荐使用
4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

类型匹配必须要唯一 

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

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

相关文章

English Learning - L2-16 英音地道语音语调 语调 2023.04.20 周四

English Learning - L2-16 英音地道语音语调 语调 2023.04.20 周四 语调降调升调降升升降 语调如何正确的表情达意用降调的句型用升调的句型用降升调的句型升降调 & 平调 回顾词重音句重音弱读语音语调四步法 存档音频 语调 降调 重音音节降 升调 一般表示不确定&#xf…

进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

目录 1.进制转换必备知识&#xff1a; 1.1 二进制逢2进1 8进制逢8进1 10进制逢10进1 16进制逢16进1 1.2为了区分二、八、十、十六进制&#xff0c;我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换 2.1 二进制转八进制 2.2 八…

移动电视双天线分集接收技术解决方案

移动电视双天线分集接收技术 随着DVB-T在手机电视、车载电视、楼宇电视、地铁电视等户外广播领域内的发展&#xff0c;在这些接收范围内&#xff0c;多径衰落、多普勒频移等小范围衰落是不可避免的问题&#xff0c;解决这些衰落和干扰成为倍受关注的问题。为了解决衰落&#x…

ROS学习第二十三节——TF坐标变换实操

1.综述 需求描述: 程序启动之初: 产生两只乌龟&#xff0c;中间的乌龟(A) 和 左下乌龟(B), B 会自动运行至A的位置&#xff0c;并且键盘控制时&#xff0c;只是控制 A 的运动&#xff0c;但是 B 可以跟随 A 运行 结果演示: 实现分析: 乌龟跟随实现的核心&#xff0c;是乌龟…

在外Windows远程连接MongoDB数据库【无公网IP】

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章&#xff1a;公网远…

【Pytorch学习笔记】12.修改预训练模型权重参数的方法(用于对单通道灰度图使用预训练模型)

文章目录 1.导出模型参数&#xff0c;修改参数2.修改模型结构&#xff0c;导回参数 我们在训练单通道图像&#xff0c;即灰度图&#xff08;如医学影像数据&#xff09;时&#xff0c;常会使用预训练模型进行训练。 但是一般的预训练模型是以ImageNet数据集预训练的&#xff0c…

OpenAI Embedding:快速实现聊天机器人(四)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding&#xff1a;快速实现聊天机器人(三)如何使用Python实现embedding相似度搜索&#xff0c;这篇文章继续讲如何将搜索到的相似文本进行提炼&#xff0c;并最终得出问题的答案。 提炼文本 通过调用azure openai服务…

数据库基础篇 《10.创建和管理表》

1. 基础知识 1.1 一条数据存储的过程 1.2 标识符命名规则 1.3 MySQL中的数据类型 其中&#xff0c;常用的几类类型介绍如下&#xff1a; 2. 创建和管理数据库 2.1 创建数据库 方式1&#xff1a;创建数据库 CREATE DATABASE 数据库名; 方式2&#xff1a;创建数据库并指…

Netty工作模型——网络IO模型的演进,从BIO到NIO到Reactor模型与Netty工作模型

文章目录 一、IO模型1、BIO&#xff08;同步阻塞&#xff09;2、NIO&#xff08;同步非阻塞&#xff09;3、AIO&#xff08;异步非阻塞&#xff09; 二、Reactor模型1、单Reactor单线程2、单Reactor多线程3、主从Reactor多线程 三、Netty工作模型1、Netty工作模型2、Netty入门案…

【Java】『蓝桥杯』10道编程题及答案(三)

系列文章 【Java】『蓝桥杯』10道编程题及答案&#xff08;一&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案&#xff08;二&#xff09; 本文链接&#xff1a;https://blog.csdn.net/y…

智能座舱域

bosch对车载系统的划分&#xff0c;通常分为5大域&#xff1a;动力域&#xff0c;底盘域&#xff0c;车身域&#xff0c;智能座舱域和adas自动驾驶域。随着ECU集成中央化的发展趋势&#xff0c;大众&#xff0c;华为等巨头将动力域&#xff0c;底盘域和车身域合并为整车控制域&…

Java中将json字符串导出为json文件【详细步骤】

一、概述 请根据具体需求具体改动&#xff0c;此代码需要将前端的数据查询出来&#xff0c;然后进行json字符串的转化 .getCatalogId(id)方法是根据id查出来的内容然后再进行转换成json字符串 也可以直接传入json字符串进行测试 二、代码 ApiOperation("导出为json文件&q…

fzyczn生日赛t1 CZN

fzy&czn生日赛t1 CZN 膜拜hybb首杀 文章目录 fzy&czn生日赛t1 CZN题目背景题目描述分析my codewnags code 题目 题目背景 有一天&#xff0c;czn在机房里面心心念念的pj终于来找他了&#xff0c;pj希望czn能够帮助她来解决一道数学题&#xff0c;czn“十分不乐意”地…

数据库基础篇 《8. 聚合函数》

1. 聚合函数介绍 聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用 1.1 AVG和SUM函数 可以对 数值型数据 使用 AVG 和 SUM 函数。 SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE %REP%; 1.2 MIN…

【Latex排版】使用Latex 排版过程中的那些一二三问题汇总

排版错误问题总结&#xff1a; 1.在【\maketitle】 位置处报错----Missing $ inserted. 2.添加参考文献&#xff0c;编译后显示错误&#xff0c;并且pdf中引用文献处为问号(?) 持续更新问题。。。。。。 近期用Latex整理期刊论文时遇到了不少问题&#xff0c;现把遇到的问题及…

2023 最新最细 vite+vue3+ts 多页面项目架构,建议收藏备用!

&#x1f33b; 前言 本文教程 github地址 。 如果对你有帮助&#xff0c;希望能点个star ⭐️⭐️⭐️ 万分感谢&#x1f60a;&#x1f60a;&#x1f60a; &#x1f9f1; 背景 不久前我司需要重新部署一个前端项目&#xff0c;由我来负责这个项目的搭建。因为这个项目是需要…

python爬虫简介

关于爬虫使用 使用python编写的爬虫脚本&#xff08;程序&#xff09;可以完成定时定量&#xff0c;指定目标&#xff08;Web站点&#xff09;的数据爬取&#xff0c;主要使用多&#xff08;单&#xff09;线程/进程&#xff0c;网络请求库&#xff0c;数据解析&#xff0c;数…

记一次误用顶层await导致的路由渲染错误

背景&#xff1a;顶层 await Async 异步函数能将 Promise 的链式调用的形式&#xff0c;改为同步的形式&#xff0c;对于编写和阅读代码都非常友好。但一直以来都有一个限制&#xff0c;就是 async 和 await 这两个关键字必须成对出现。这就导致了一个问题&#xff0c;想使用 …

【JavaScript速成之路】一文带你掌握DOM基础

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录 前言1&#xff0c;Web API简介1.1&#xff0c;初识Web API1.2&#xff0c;Web A…

TryHackMe-Services(Windows域渗透)

Services 认识团队&#xff01; 今天thm新出的房间&#xff0c;尝尝鲜 端口扫描 循例nmap 把services.local加入hosts Web枚举 发现员工邮箱以及一些员工姓名 从下边的邮箱中&#xff0c;大致可以猜测其他员工账户名跟这个一致的格式 将其保存起来 立足 - AS-REP Roasting…