SpringBoot控制反转和依赖注入

 

目录

 

一、内聚和耦合

二、分层解耦

三、具体实现

四、bean的组件扫描

五、bean注入


一、内聚和耦合

        在了解分层解耦的概念之前我们我们要去先了解一下内聚和耦合。内聚:通常将的是软件中各个模块之间的功能联系。耦合衡量软件各个模块之间的依赖、关联的程度。一个项目中各个模块之间相互联系越紧密则耦合性越高,模块的独立性就越低,反之亦然。软件设计的原则:高内聚低耦合。在上一篇文章我们搭建了一个简单的三层架构。

实现了service层和dao层的耦合。

实现了service和controller层的耦合。

二、分层解耦

        从上面我们可以看出各个模块之间存在一些耦合,我们应该如何进行解耦呢?如果直接删除上述高亮显示代码会报错,我们会提供一个容器去存储创建的对象,我们从容器中取需要的对象。对象该如何交给容器进行管理?容器怎么提供所依赖的资源?涉及到一些新的概念:控制反转、依赖注入和Bean对象。

        控制反转:Inversion of Control,简称IOC。对象创建控制权由程序自身转移到外部(Spring容器)。

        依赖注入:Dependency injection,简称DI。容器为应用程序提供运行时,所依赖的资源。

        Bean对象:IOC 容器中创建、管理的对象。

三、具体实现

@Component:指定一个普通的Bean,可以作用在任何层次。
@Controller:指定一个控制器组件Bean。
@Service:指定一个业务逻辑组件Bean。
@Repository:指定一个数据访问组件Bean。
@Scope:指定 Bean 实例的作用域。
@Value:指定Bean 实例的注入值

        在声明bean 的时候,可以通过value属性来指定Bean的名字,如果没有指定,默认为类名首字母小写。在springboot集成web开发中,声明控制器bean只能用@controller。

四、bean的组件扫描

        前面说到的bean的四大注解(@Repository、@Service、@Controller和@Component),要想生效还需要被注解@ComponentScan扫描。@ComponentScan注解虽然没有显示配置,但是实际上已经包含在启动类声明注解@SpringBootApplication中,默认的扫描范围是启动类所在包(com.example.demo)及其子包。

如果需要扫描的com.example.demo之外的包,可以通过@ComponentScan进行设置@ComponentScan({“dao”,"com.example.demo"}),这种方式不推荐使用。推荐放在启动类所在包。

五、bean注入

       @Autowired:指定要自动装配的对象。默认按类型进行装配,换一句话说就是去IOC容器中找指定类型的bean对象,然后完成注入。如果有两个类型一样的bean会报错。

        可以通过一下几种方式进行解决:

@Primary:用于标记一个或多个Bean作为首选的候选者。

@Qualifier:指定要自动装配的对象名称,通常与Autowired 联合使用。

@Resource:指定要注入的对象,默认根据名称进行区分。

    

@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。@Autowired默认是按照类型注入,而@Resource默认是按照名称注入。

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

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

相关文章

【ai】tx2 nx : fix pip升级警告

jetson 环境同样出现:【原创】pip3 使用报警问题在对 Ubuntu 18.04 上的 pip3 9.0.1 版本使用 pip install -U pip 的方式进行升级后,再使用 pip 就会出现一堆警告信息。这个警告信息目前不影响使用,但从警告信息来看,会在未来版本中出现失败风险。 当前系统中存在了两个不…

Android反编译之Apktool

文章目录 简述工具操作步骤 简述 可以从apk安装包中提取出res、AndroidManifest、xml等文件;也可以修改资源文件后rebuild一个apk。 工具 1.官方下载地址 https://apktool.org/ 2.操作指令 // 解析apk包 $ apktool d test.apk // 重新rebuid apk包 $ apktool …

vscode_cmake_stm32_lvgl移植及显示优化

1 LVGL移植 本文使用的环境如下: STM32H743FreeRTOSst7789 lcd(320*240) 下载 LVGL源码,本文使用Release v9.1.0; 将压缩包解压到工程目录,例如stm32h7xx_cmake_project/components/lvgl-9.1.0,如下所示: …

vue3封装表格嵌套表单问题汇总

1.插槽嵌套多层数据ui组件怎么使用 思路&#xff1a;插槽具名【区分】后暴露传递&#xff0c;这个为神魔要区分&#xff0c;因为封装组件表格列表项也有插槽 步骤一&#xff1a;表单插槽暴露 <ElFormclass"form-search":model"formParams"ref"form…

Linux 磁盘挂载与分区

Linux 磁盘挂载与分区 vda1: 其中vd表示虚拟磁盘&#xff0c;a表示第一块磁盘&#xff0c;b表示第二块磁盘&#xff0c;1表示第一块磁盘的第一分区&#xff08;显然两块磁盘都只有一个分区&#xff09;图中可以看到&#xff0c;vda1磁盘只有一个分区&#xff0c;且全部挂载到根…

期末复习题中的问题

一、编程中&#xff08;包括函数&#xff09;的问题 1. malloc 头文件是stdlib.h 二、第二次写复习题的不会的 三、程序填空 总结&#xff1a; 删除节点m >>>>要有一个指针来遍历找到这个m >>>> 用另一个指针指向这个指针的下一 个 >>&…

【数据结构与算法】堆排序算法 详解

堆排序算法 Status heapAdjust(ElemType *a, int s, int m) {ElemType t a[s];for (int j s * 2 1; j < m; j j * 2 1) {if (j < m && a[j] < a[j 1]) {j;}if (t > a[j]) {break;}a[s] a[j];s j;}a[s] t;return OK; }Status heapSort(ElemType *a…

[C#][opencvsharp]C#使用opencvsharp进行年龄和性别预测支持视频图片检测

使用 OpenCVSharp 来调用 age_net.caffemodel 和 gender_net.caffemodel 来进行性别和年龄预测涉及几个步骤。以下是一个简化的流程和示例文案&#xff1a; 1. 准备工作 确保你已经安装了 OpenCVSharp 和相关的依赖项。确保你有 age_net.prototxt、age_net.caffemodel、gende…

【redis】redis概述

1、定义 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的、内存中的数据结构存储系统。redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)…

Web前端第四次作业

目录 一、编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中所有数字的平均值 二、编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中的最大值 三、编写一个函数&#xff0c;形参是一个字符串&#xff0c;统计该字符串中每个字母出现的次数&#…

Windows 获取打印机及端口号方法 (C#)

1. 打开注册表编辑器 regedit 2.选择如下配置 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代码 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

Commons-Collections篇-CC5链分析

前言 CC5链和CC1差不多&#xff0c;只不过调用LazyMap.get()是通过TiedMapEntry.toString()触发的 1.环境 我们可以接着使用之前已经搭建好的环境&#xff0c;具体过程可以看CC1分析文章的环境安装部分 Commons-Collections篇-CC1链小白基础分析学习 2.分析 我们先把后半段…

云南省森林管理新篇章:可视化大屏引领绿色智慧革命

在云南省这片绿意盎然的土地上&#xff0c;森林不仅是自然的宝藏&#xff0c;更是生态的守护者。 想象一下&#xff0c;站在巨大的屏幕前&#xff0c;云南省的森林分布、生长状况、病虫害情况等信息一目了然&#xff0c;仿佛拥有了一双能够洞察森林奥秘的“智慧眼”。这正是森林…

生产环境:CentOS 7 Docker 20.10.19离线部署(为离线部署k8s做准备)

背景描述&#xff1a;离线部署Docker环境 在现代IT基础设施中&#xff0c;Docker已经成为应用容器化的标准工具。它简化了应用程序的部署和管理&#xff0c;使开发者和运维工程师能够以更高的效率和一致性进行工作。然而&#xff0c;在某些场景下&#xff0c;由于安全性、网络…

[leetcode]move-zeroes 移动零

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

手机远程控制另一台手机的全新使用教程(安卓版)

看完这篇文章&#xff0c;你可以了解到安卓手机如何远程控制安卓手机&#xff0c;以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机&#xff0c;或者苹果手机远程管控另一台苹果手机&#xff0c;请点击查看视频《手机远程管控另一台手机的全新使用教程…

go语言day2 配置

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

SQLite:一个极简使用教程

SQLite是一个轻量级的、文件系统基础的数据库&#xff0c;它被设计为配置简单、易于部署。SQLite数据库存储在一个单一的磁盘文件中&#xff0c;这意味着数据库的创建和维护都非常简单。 1. SQLite特点 轻量级&#xff1a;SQLite不需要一个独立的服务器进程。它是一个嵌入式SQ…

机器学习/pytorch笔记:time2vec

1 概念部分 对于给定的标量时间概念 t&#xff0c;Time2Vec 的表示 t2v(t)是一个大小为 k1的向量&#xff0c;定义如下&#xff1a; 其中&#xff0c;t2v(t)[i]是 t2v(t)的第 i 个元素&#xff0c;F是一个周期性激活函数&#xff0c;ω和 ϕ是可学习的参数。 以下是个人理解&am…

Open3D 将ShapeNet数据集txt转pcd

目录 一、概述 二、代码实现 三、实现效果 一、概述 ShapeNet 数据集是一个广泛使用的三维物体数据集&#xff0c;主要用于计算机视觉、计算机图形学、机器人学和机器学习等领域的研究。它包含大量的三维物体模型&#xff0c;并附有丰富的标注信息。ShapeNet 数据集由普林斯…