Spring的自动化装配

news/2024/4/23 19:06:51/文章来源:https://www.cnblogs.com/guohongzhi/p/16610970.html

   在Spring中,对象无需自己查找和创建与其所关联的其他对象。相反,容易负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理的组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质。
Spring容器负责创建应用程序的bean并通过DI来协调这些对象之间的关系。但是,作为开发人员,你需要告诉Spring要创建那些bean并且如何将其装配在一起。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:

  • 在XML中进行显式配置;
  • 在Java中进行显式配置;
  • 隐式的bean发现机制和自动装配;

1.自动化装配

 Spring 从两个角度来实现自动化装配:

组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 bean。
自动装配(autowiring):Spring 自动满足 bean 之间的依赖。

1.1 创建可被发现的 bean

目录结构

   CD 为我们阐述 DI 如何运行提供了一个很好的样例。如果你不将 CD 插入(注入)到 CD 播放器中,那么 CD 播放器其实是没有太大用处的。所以,可以这样说,CD 播放器依赖于 CD 才能完成它的使命。
为了在 Spring 中阐述这个例子,让我们首先在 Java 中建立 CD 的概念。以下展现了 CompactDisc,它是定义 CD 的一个接口:

  package soundsystem;
/*** @author 国洪志* @description 光盘* @since 2022-08-22 09:55**/
public interface CompactDisc {/*** 演奏*/void play();
}

   CompactDisc 的具体内容并不重要,重要的是你将其定义为一个接口。作为接口,它定义了 CD 播放器对一盘 CD 所能进行的操作。它将 CD 播放器的任意实现与 CD 本身的耦合降低到了最小的程度。
我们还需要一个 CompactDisc 的实现,实际上,我们可以有 CompactDisc 接口的多个实现。在本例中,我们首先会创建其中的一个实现,带有 @Component 注解的 CompactDisc 实现类 SgtPeppers:

package soundsystem;import org.springframework.stereotype.Component;/*** @author 国洪志* @description* @since 2022-08-22 09:58**/
@Component
public class SgtPeppers implements CompactDisc {private String title = "Sgt. Pepper's Lonely Hearts Club Band";private String artist  = "The Beatles";@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);}
}

  你需要注意的就是 SgtPeppers 类上使用了 @Component 注解。这个简单的注解表明该类会作为组件类,并告知 Spring 要为这个类创建 bean。没有必要显式配置 SgtPeppersbean,因为这个类使用了 @Component 注解,所以 Spring 会为你把事情处理妥当。
不过,组件扫描默认是不启用的。我们还需要显式配置一下 Spring, 从而命令它去寻找带有 @Component 注解的类,并为其创建 bean。以下的配置类展现了完成这项任务的最简洁配置,@ComponentScan 注解启用了组件扫描:


package soundsystem;import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;/*** @author 国洪志* @description* @since 2022-08-22 10:49**/
@Configurable
@ComponentScan
public class CdPlayerConfig {
}

如果你更倾向于使用 XML 来启用组件扫描的话,那么可以使用 Spring context 命名空间的元素。以下展示了启用组件扫描的最简洁 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"xmlns:c="http://www.springframework.org/schema/c"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="soundsystem" />
</beans>

为了测试组件扫描的功能,我们创建一个简单的 JUnit 测试,它会创建 Spring 上下文,并判断 CompactDisc 是不是真的创建出来 了。CDPlayerTest 就是用来完成这项任务的,测试组件扫描能够发现 CompactDisc:

package soundsystem;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static org.junit.Assert.assertNotNull;/*** @author 国洪志* @description* @since 2022-08-22 10:51**/
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = CdPlayerConfig.class) JavaConfig使用这个
@ContextConfiguration(value = "/soundsystem.xml") // xml文件使用这个
public class CdPlayerTest {@Autowiredprivate CompactDisc cd;@Testpublic void cdShouldNotBeNull(){assertNotNull(cd);}
}

1.2 为组件扫描的 bean 命名

  Spring应用上下文中所有的bean都会给定一个ID.在前面的例子中,尽管我们没有明确地为
SgtPeppersbean设置ID,但是Spring会根据类名为其指定一个ID。具体来讲,这个bean所给定的ID为sgtPeppers,也就是将类名的第一个字母变为小写。
如果想为这个beans设置不同的ID,你所要做的就是将期望的ID作为值传递给@Component注解。比如说,如果想将这个bean标识为lonelyHeartsClub,那么你需要将 SgtPeppers 类的 @Component 注解配置为如下所示:

package soundsystem;import org.springframework.stereotype.Component;import javax.inject.Named;/*** @author 国洪志* @description* @since 2022-08-22 09:58**/
@Component(value = "lonelyHeartsClub")
//@Named(value = "lonelyHeartsClub")//另一种命名方式:Java 依赖注入规范(Java Dependency Injection)中所提供的 @Named 注解来为 bean 设置 ID:
public class SgtPeppers implements CompactDisc {private String title = "Sgt. Pepper's Lonely Hearts Club Band";private String artist  = "The Beatles";@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);}
}

1.3 设置组件扫描的基础包

  到现在为止,我们没有为 @ComponentScan 设置任何属性。这意味着,按照默认规则,它会以配置类所在的包作为基础包(base package)来扫描组件。但是,如果你想扫描不同的包,那该怎么办呢?或者,如果你想扫描多个基础包,那又该怎么办呢?
有一个原因会促使我们明确地设置基础包,那就是我们想要将配置类 放在单独的包中,使其与其他的应用代码区分开来。如果是这样的话,那默认的基础包就不能满足要求了。
要满足这样的需求其实也完全没有问题!为了指定不同的基础包,你所需要做的就是在 @ComponentScan 的 value 属性中指明包的名称:

package soundsystem;import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;/*** @author 国洪志* @description* @since 2022-08-22 10:49**/
@Configurable
@ComponentScan("soundsystem") //value属性指定包名
//@ComponentScan(basePackages = "soundsystem") // 根据basePackages指定包名
//@ComponentScan(basePackages = {"soundsystem", "video"})// 根据basePackages指定多个包名
public class CdPlayerConfig {
}

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

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

相关文章

jQuery使用ajax

1.导入jQuery的js库2.jQuery发送单一的get请求$.get(url:接口地址,data:{id:1,name:2,......}function(res){// res是服务器返回的数据} ) 3.jQuery发送单一的post请求$.post(url:接口地址,data:{id:1,name:哈哈哈,......}function(res){// res是服务器返回的数据} ) 4.jQuery发…

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法 - 悟寰轩-叶秋 - 博客园 https://www.cnblogs.com/sunxucool/p/3449068.html 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有提到,…

引入VUE的方式(8种)

第一类: 1、本地引入 把vue的js文件下载下来引入 2、CDN引入 把vue.js网址引入 3、把vue.js文件放在项目文件夹src中引入项目 然后webpack打包4、编辑器直接生成cdn的方式第二类: 5、自己构建vue的脚手架/* 1.新建项目 alipay 2.初始化配置文件:npm init -y 3.下载依赖:npm…

PipeCAD-捕捉选项

PipeCAD-捕捉选项PipeCAD-捕捉选项 eryar@163.com Key Words. PipeCAD, 三维管道设计软件,三维工厂设计软件,三维配管软件 1 概述 在PipeCAD交互设计过程中,有些建模操作需要在模型中捕捉点来进行定位。通过捕捉点可以快速、准确建模。一般的CAD软件中都有捕捉功能,为了给用…

CentOS 安装Nginx并部署vue项目

安装 yum install nginx配置nginx设置开机启动 systemctl enable nginx启动服务 systemctl start nginx停止服务 systemctl stop nginx重启服务 systemctl restart nginx修改配置后热重载 systemctl reload nginxnginx常用目录路径 説明/etc/nginx/ 保存Nginx设置文件的目录/et…

多示例学习

在机器学习中,多示例学习(Multiple Instance Learning 简称 MIL)是由监督型学习算法演变出的一种方法,定义“包”为多个示例的集合,具有广泛的应用。学习者不是接收一组单独标记的实例,而是接收一组带标签的包,每个包拥有多个实例。在多实例二进制分类的简单情况下,如果包…

在一些常见用例中修复详尽的deps警告

反应开发 在一些常见用例中修复详尽的deps警告在里面 上一篇文章 ,我们查看了正确使用 useEffect 钩子需要采用的正确心智模型。在本文中,让我们看看如何调整这种思维模型来解决一些常见的用例。这也将帮助您避免详尽的部门警告。 在 mount 上做某事 首先,我认为这个想法本身…

js实现幻灯片

使用原生js实现轮播图 html代码<div class="slide"><ul><li style="display: block;"><img src="1.jpg"></li><li><img src="2.jpg"></li><li><img src="3.jpg"&…

字节跳动基于 ClickHouse 优化实践之“查询优化器”

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 相信大家都对大名鼎鼎的 ClickHouse 有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了 ClickHouse 依然存在了一定的限制。例如:缺少完整的 upsert…

echarts-dataset数据源配置项

如下效果图: 代码入下:let box4 = document.querySelector(.box4)let myCharts3 = echarts.init(box4)myCharts3.setOption({dataset:{// 二维数组存放数据source:[// 0 1 2 3 4 5 六个维度[衣服,22,15,36,35,18],[食品,60,39,50,15,22],[生活用品,60,52,36,15…

RN 调试

使用前先关闭debugger模式关闭谷歌,在打开调试工具,然后再打开debugger 1.使用谷歌浏览器来调试不能查看标签结构不能查看网络请求 2.使用rn推荐的工具react-native-debugger来调试https://github.com/jhen0409/react-native-debugger/releases可以查看标签结构不能查看网络请…

Excel聚光灯设置

1.同时按住 ALT+F11进入vba 2.双击要设置的sheet页 3.输入以下代码Private Sub Worksheet_SelectionChange(ByVal Target As Range)Cells.Interior.ColorIndex = xlNoneTarget.EntireRow.Interior.ColorIndex = 24Target.EntireColumn.Interior.ColorIndex = 24End Sub4.效果如…

【三维地图】开发攻略 —— 详解“GeoJSON”技术和应用场景

GeoJSON ,一个用于存储地理信息的数据格式。GoeJSON对象可以表示几何、特征或特征集合,支持:点、线、面、多点、多线、多面和几何集合。在基于平面地图,三维地图中都需要用到的一种数据类型。 由于这种格式在三维地图中的优秀属性,使用它我们不仅可以轻松实现地图类功能,…

JavaScript设计模式及代码实现——单例模式

单例模式1 定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。2 应用时机当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源。比如 dialog 弹窗会被全局重复使用 业务功能本身决定了全局只能有唯一的实例。比如 redux 管理的数据,只能有唯一的一份3 …

ubuntu18.04屏幕录制Vokoscreen

Vokoscreen 可被视为具有良好分类菜单的简单屏幕录制机的更好 UI 版本。- 除了在simplescreenrecorder中包含的所有功能,Vokoscreen 还支持外部网络摄像头以及内置网络摄像头。 然而,它不支持在simplescreenrecorder中可用的 JACK 音频。 下载命令:sudo apt install vokoscr…

磁共振成像原理

目录1. 原子核的自旋2. 进动3. 磁共振现象4. 射频脉冲1. 原子核的自旋 原子有原子核和绕核运动的电子组成。 原子核的自旋:质子数和中子数一个为奇数、一个为偶数; 两者都为奇数这两种情况的原子核就会自旋。原子核是带正电,绕自旋轴旋转,效应相当于环形电流,周围会产生磁…

业务流程可视化-让你的流程图Run起来(7.运行状态持久化轻量工作流支持)

前言 感谢大家阅读本项目系列文章和对项目的支持。分享一下我对这个项目的新的改进。 之前项目做到了流程设计可视化和流程运行结果可视化。 本期发布的版本中实现了中间的运行过程的实时可视化,和流程状态持久化问题。 大家可以根据项目提供的接口自由扩展自己的工作流实现。…

DataGrip连接Mysql报08S01解决方案

以前正常使用的GataGrip,突然在某天报下面的错误提示:08S01 [08S01]Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. No appropriate protocol (protocol is…

数据结构面试总结【第一弹】

数据结构面试总结 目录数据结构面试总结1.数据结构基本概念1.1 数据结构三要素2.线性表2.1 数组与链表有什么关系2.2 线性表的存储结构2.3 头指针和头节点的区别2.4 栈和队列的区别3.树3.1 度数为2的树与二叉树有什么区别3.2 唯一确定一棵二叉树3.3 二叉排序树3.4 最小生成树有…

优爱酷模拟点击自动翻页_自动展开所有批量网页转mhtml单网页保存

优爱酷模拟点击自动翻页_自动展开所有批量网页转mhtml#涨知识# 终于可以解放双手了! 1、页面有很多“折叠”的需要“展开”的内容,例如:点击查看全文,展开 等的网页,1个还好,多个“展开”如何解决?如果能#自动展开#岂不美哉? 2、普通网页翻页后链接会变化成不一样的,遇…