【学习】Spring IoCDI

  • 🎥 个人主页:Dikz12
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

Spring 是什么?

什么是 IoC容器?

传统开发模式 

loC开发模式

IoC的优势 

IoC 的使用

Bean的存储 

 方法注解

 DI

 属性注入

 构造⽅法注⼊

 Setter 注⼊

@Autowired存在的问题

 解决方案:

 @Autowired和@Resource的区别


Spring 是什么?

 Spring是一个开发应用框架,其目的是用于简化企业级应用程序开发. Springd的原生框架指的是Spring Core、Spring FrameWork; 这个概念是比较抽象的,可以用一句更具体的话来概述:Spring是包含众多工具的 IoC容器.

什么是 IoC容器?

“容器”通常指的是一种可以用来盛放物品的器皿;⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器,像 List/ Map就是数据存储的容器、Tomcat 就是Web容器;

IoC:Inversion of Control (控制反转),也是Spring两大核心思想之一. 也就是说: Spring是⼀个"控制反转"的容器.

什么是控制反转?

也就是控制权反转,获取依赖对象的过程被反转了,当需要 某个对象时,传统开发模式中需要自己通过new创建对象,现在不需要在进行创建,而是把这个创建对象的任务交给了容器. 程序只需要依赖注入(DI)就可以. 这个容器就是IoC容器.

IoC是一种思想,在生活中也有体现:

比如:传统的驾驶方式,车辆的控制权需要由驾驶员来控制,而现在就可以把驾驶权交给自动化系统来控制。

IoC是一种思想,DI是一种实现方式!

传统开发模式 

 设计轮⼦(Tire),然后根据轮⼦的⼤⼩设计底盘(Bottom),接着根据底盘设计⻋⾝(Framework),最后根据⻋⾝设计好整个汽⻋(Car)。这⾥就出现了⼀个"依赖"关系:汽⻋依赖⻋⾝,⻋⾝依赖底盘,底盘依赖轮⼦.

public class Main {public static void main(String[] args) {Car car = new Car(17);car.run();}
}static class FrameWork {private Bottom bottom;public FrameWork(int size) {bottom = new Bottom(size);}
}static class Bottom {private Tire tire;public Bottom(int size) {tire = new Tire(size);System.out.println("Bottom...init..");}
}static class Tire {public int size;private String color;public Tire(int size) {this.size = size;System.out.println("tire....init...size:"+size);}
}

 从以上代码可以看出,以上程序的问题是:当最底层代码改动之后,整个调⽤链上的所有代码都需要修改.程序的耦合度⾮常⾼(修改⼀处代码,影响其他处的代码修改)

loC开发模式

把调⽤汽⻋的程序⽰例改造⼀下,把创建⼦类的⽅式,改为注⼊传递的⽅式.
 

public class Main {public static void main(String[] args) {Tire tire= new Tire(17,"red");Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.run();}
}

代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了.

IoC的优势 

  1. 资源集中管理,实现资源的可配置和易管理。
  2. 降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度(解耦)。

IoC 的使用

Bean的存储 

 共有两类注解类型可以实现:

  • 1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration.
  • 2. ⽅法注解:@Bean.
@Controller //把这个对象交给Spring进行管理
public class UserController {public void hello() {System.out.println("Hello,Controller");}
}

 获取对象:

    public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IocDemoApplication.class, args);//从Spring上下⽂中获取对象UserController userController = context.getBean(UserController.class);userController.hello();}

  • @Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应.
  • @Servie:业务逻辑层,处理具体的业务逻辑.
  • @Repository:数据访问层,也称为持久层.负责数据访问操作
  • @Component :组件存储.
  • @Configuration:配置层.处理项⽬中的⼀些配置信息

 方法注解

类注解是添加到某个类上的,但是存在两个问题:

  • 1. 使⽤外部包⾥的类,没办法添加类注解
  • 2. ⼀个类,需要多个对象,⽐如多个数据源

这种场景,我们就需要使⽤⽅法注解@Bean.

@Configuration
public class BeanConfig {@Bean("u1")public User user1() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}

@Bean 方法注解要搭配类注解一起使用,否则就是报错!! 可以对Bean对象进行重命名操作.

 DI

 依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.

关于依赖注⼊,Spring也给我们提供了三种⽅式:

  • 1. 属性注⼊
  • 2. 构造⽅法注⼊
  • 3. Setter注⼊

 属性注入

 属性注⼊是使⽤@Autowired注解实现的. 比如:将Service 类注⼊到 Controller类中.

@Controller //把这个对象交给Spring进行管理
public class UserController {@Autowiredprivate UserService userService;public void hello() {System.out.println("Hello,Controller");userService.hello();}
}
@Service
public class UserService {public void hello() {System.out.println("Hello,UserService...");}
}

 构造⽅法注⼊

@Controller
public class UserController2 {//注⼊⽅法2: 构造⽅法private UserService userService;public UserController2() {}@Autowiredpublic UserController2(UserService userService) {this.userService = userService;}public void hi(){System.out.println("hi,UserController2...");userService.hello();}
}

去掉@Autowired,就会报异常,如下:

 如果类只有⼀个构造⽅法,那么,@Autowired注解可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired来明确指定到底使⽤哪个构造⽅法。

 Setter 注⼊

@Controller
public class UserController3 {//注⼊⽅法3: Setter⽅法注⼊private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void hello() {System.out.println("hello,UserController3...");userService.hello();}
}

如果去掉@Autowired的话,就会报空指针异常!

@Autowired存在的问题

 当同⼀类型存在多个bean时,使⽤@Autowired会存在问题.

 

会出两个bean对象,非唯一的bean对象,Spring就不知道要用那个了,直接就启动失败! 

 解决方案:

1.修改@Autowired的属性名跟Bean的名称一致.

 

 2.使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

3. 使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称。 @Qualifier注解不能单独使⽤,必须配合@Autowired使⽤.

 4.使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

 @Autowired和@Resource的区别

  1.  @Autowired默认是以类型注入的,当同一个类型有多个对象,也会按名称进行匹配,如果名称匹配不到,就会报错;@Resource 是按照名称注入的,使用name指定注入。
  2. @Autowired是由Spring提供的注解;@Resource是JDK提供的注解。

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

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

相关文章

飞书在成都举办先进生产力峰会,新希望、万华投资等企业参加

4月12日,飞书在成都举办“共谋新质、与先进齐飞”先进生产力峰会,该会由川商总会支持举办。峰会上,飞书邀请多名川渝明星企业一号位、管理者探讨“如何让区域经济走向全国经济”,探索千行百业的高质量发展道路。 会上&#xff0c…

视频号小店新商机逐渐爆发,高门槛仍挡不住商家前进的脚步!

大家好,我是电商花花。 不知道大家有没有发现一件很有意思的事情,就是现在有越来越多的商家涌入抖音小店,部分商家还是想在视频号小店里博一丝机会。 我们都知道视频号小店是除了抖音小店之外,最火热的项目了,部分商…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展,DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素,各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击,随之而来的就是业务宕机,用户无法…

【JS】获取接口返回 EventStream 结构的数据(即接收读取 stream 流)

文章目录 EventStream 是一种服务器推送的数据格式,可以用于实时数据传输。 接口返回的示例图 获取示例: // 这里的 url 为虚拟的,仅供演示用 fetch(https://test.cn.com/api/agent/2, {method: POST,headers: {Content-Type: applicatio…

代码随想录 Day17 字符串 | LC344 反转字符串 LC541 反转字符串II 卡码网54替换数字

一、反转字符串 题目: 力扣344:反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题…

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版

【dfs题解】---只有50分 (头一回自己用dfs做出来了dp的hard等级的大题&#xff0c;从来没有拿50分这么高兴过哈哈哈哈哈) #include <bits/stdc.h> using namespace std; int n,m; long long ans0; const long long mol1e97; void dfs(int h,int d,int sum) {if(h<0|…

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks系列传送门 一、安装包 有需要的朋友可以私信~ 二、安装 安装挺简单 1、先安装DVD-R147826.1-1-01-vx69.udf.iso 镜像中的Setup.exe程序&#xff0c;记住要使用管理员权限 2、再安装DVD-R147826.1-23-00.iso 镜像中的Setup.exe程序&#xff0c;同样要使用管理员权限 3…

69787987

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

C-开发 visual Studio扩展插件介绍-格式化插件Xaml Styler、CSharpier介绍(扩展插件安装方法)

C#开发 visual Studio扩展插件介绍 扩展插件安装方法Xaml StylerCSharpier 提高C#开发效率常用的插件 扩展插件安装方法 菜单栏点击“扩展”→“管理扩展”。 打开扩展页面 右上角搜索需要安装的插件&#xff0c;然后点击下载 安装完成后&#xff0c;根据提示关闭VS进行安…

spring04:注解使用

spring04&#xff1a;注解使用 文章目录 spring04&#xff1a;注解使用前言&#xff1a;一、 Autowired Qualifier和 Resource 和 nullable1. Autowired 2. Resource &#xff1a;使用在类的属性上面&#xff08;和Autowired类似&#xff09;3. nullable 二、 Component 和 Re…

数据库体系概述:详述其基本概念、多样分类、关键作用及核心特性

数据库是一个用于存储、管理和检索数据的系统&#xff0c;它按照特定的数据结构和模式组织数据&#xff0c;确保数据的一致性、安全性和高效访问。 数据库&#xff08;Database, DB&#xff09;是一个长期存储在计算机内&#xff0c;用来组织、存储和管理大量数据的集合。数据…

yolov8草莓及病害检测项目开发(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;可以通过图片、视频或摄像头三种形式检测&#xff0c;检测出开花、结果、熟果、草莓叶子健康、叶子缺钙、灰叶斑病等八大类别。基于最新的YOLO-v8模型&#xff0c;下载后即可重新运行训练脚本&#xff0c;&#xff0c;也可以直接运行检测脚本&#xff…

StarRocks 物化视图:指标平台性能提升的新引擎

随着大数据技术的发展&#xff0c;企业对于实时数据分析和决策支持的需求日益增长。在这样的背景下&#xff0c;指标平台的构建成为了企业数据战略的核心组成部分。一个高效的指标平台不仅能够确保数据的准确性和一致性&#xff0c;还能显著提升数据分析的速度和灵活性。在这样…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起&#xff0c;与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族&#xff0c;Ransomhub和Blackbasta恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。…

最简单知识点PyTorch中的nn.Linear(1, 1)

一、nn.Linear(1, 1) nn.Linear(1, 1) 是 PyTorch 中的一个线性层&#xff08;全连接层&#xff09;的定义。 nn 是 PyTorch 的神经网络模块&#xff08;torch.nn&#xff09;的常用缩写。 nn.Linear(1, 1) 的含义如下&#xff1a; 第一个参数 1&#xff1a;输入特征的数量…

Vue 引入config.js后别的js访问不到window对象下的属性

Vue项目里,我们项目配置的请求服务器地址都是在public里config.js里,如下例: 然后在index.html里引入config.js,如下图: 这里要注意的是,script的src要写上<%= BASE_URL %>,代码如下: <!DOCTYPE html> <html><head><meta charset="…

【深度学习】环境搭建ubuntu22.04

清华官网的conda源 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 安装torch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia 2.2.2 conda install 指引看这里&#xff1a; ref:https://docs.nvidia.com/cuda/cuda-installatio…

TechTool Pro for Mac v19.0.3中文激活版 硬件监测和系统维护工具

TechTool Pro for Mac是一款专为Mac用户设计的强大系统维护和故障排除工具。它凭借全面的功能、高效的性能以及友好的操作界面&#xff0c;赢得了广大用户的信赖和好评。 软件下载&#xff1a;TechTool Pro for Mac v19.0.3中文激活版 作为一款专业的磁盘和系统维护工具&#x…

SNRO 编号范围对象管控,唯一ID

事务代码:SNRO 代码引用: DATA: MAXTID TYPE I,NEWNO TYPE CHAR8. CALL FUNCTION NUMBER_RANGE_ENQUEUE EXPORTING OBJECT ZQC57 EXCEPTIONS FOREIGN_LOCK 1 OBJECT_NOT_FOUND 2 SYSTEM_FAILURE 3 OTHERS …

Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)

一、前言 记录时间 [2024-4-6] 前置文章&#xff1a;Docker学习笔记&#xff08;一&#xff09;&#xff1a;入门篇&#xff0c;Docker概述、基本组成等&#xff0c;对Docker有一个初步的认识 在上文中&#xff0c;笔者进行了Docker概述&#xff0c;介绍其历史、优势、作用&am…