Spring ----> IOC
文章目录
- 一、 Spring 是一个包含众多工具的IoC容器
- 二、 什么是IOC以及好处
- 三、 如何实现loc思想
- 四、Spring提供的实现loC的方法 --- 类注解+方法注解
- 4.1 类注解
- 类注解概念介绍
- 类注解的使用
- 4.2 方法注解@Bean
一、 Spring 是一个包含众多工具的IoC容器
- 场景解析:首先我们已经了解到了【Spring】是一个框架,但这个概念依旧很笼统,Spring又究竟为什么有这么强大的能力,可以帮我们快速搭建项目 ------------> Spring 是一个包含众多工具的IoC容器(这个Spring实际是指Spring Core、Spring Framework这个原生的框架)
- 概念解析:
- 包含众多工具:我们可以通过Spring引入并管理依赖
- 容器:是一个被用烂了的概念,我们可以通俗理解为【里面可以装东西】,Tomcat和List等都可以理解为一个容器
- List/Map……:装数据的容器
- Tomcat:装web的容器
- Spring容器:装对象的容器。
- 因为Spring是用来简化Java开发的框架,Java又是面向对象的,所以Spring是装对象的容器。
- “对象”这个词,在Spring的范围内称为“bean”
- loC:见下面
二、 什么是IOC以及好处
- loC是什么:控制(控制权)反转,是一种思想,Spring是其一种实现方式(具体表示为DI),下面讲解都以Spring为例子
- 是什么控制权:这取决于实现方式,此处因为管理的是对象,所以控制权指的是【创建和拿出对象的控制权】
- 控制权反转是什么意思:由【谁用谁创建,自给自足】,变为【由Spring帮我们统一创建】
- 此处是BookController需要BookService对象,所以他自己创建了
- 交给Spring后,BookController将不自己创建,而是只负责去Spring里拿(把创建的操作外包出去)
- 为什么我们使用了Spring提供的注解,Spring就能帮我们完成对应操作:控制反转思想的体现
- 以@RequestController注解为例,加了这个注解,相当于告诉Spring帮我们管理这个对象,后续访问的时候,要求能访问到
- loC的好处:减少模块之间的耦合
- 如果自己创建,当被调用的类中出现了属性之类的修改,被调用方也需要跟着修改,代码修改量较大,耦合性较高
- 如果自己创建,当被调用的类中出现了属性之类的修改,被调用方也需要跟着修改,代码修改量较大,耦合性较高
三、 如何实现loc思想
- 核心:交给别人去创建,自己只负责接收
- 方式一:手搓,需要自己new
public class Tire {private int size;public Tire(int size){this.size = size;System.out.println("tire");}
}public class Bottom {private Tire tire;public Bottom(Tire tire){this.tire = tire;System.out.println("bottom");}
}public class Framework {private Bottom bottom;public Framework(Bottom bottom){this.bottom = bottom;System.out.println("framework");}
}public class Main {public static void main(String[] args) {Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);}
}
- 方式二:Spring 提供的方法
- 为什么不用static解决loC问题:static是独立于整个类存在的,是所有对象共享的。而我们是需要给这个对象的某个属性赋值对象,两者不是一个概念
四、Spring提供的实现loC的方法 — 类注解+方法注解
4.1 类注解
类注解概念介绍
-
有什么:@Controller、@Service、@Repository、@Configuration、@Component
- @Controller(控制器存储)、@Service(服务存储)、@Repository(仓库存储):分别对应了三层架构中的“Controller层”、“Service层”、“Dao层”
- 数据库就是一个数据仓库
- @Configuration(配置存储):Spring能帮我们管理的配置是大众使用的,如果是那种小众的,由于性价比低,Spring并未支持,此时就需要我们手动配置了
- @Component(组件存储):让Spring帮我们管理组件相关的代码
- @Controller(控制器存储)、@Service(服务存储)、@Repository(仓库存储):分别对应了三层架构中的“Controller层”、“Service层”、“Dao层”
-
类注解作用:方便区分(看到这个注解就可知道该代码属于哪一层)
- 共同点:都是告诉Spring帮我们管理对象
- 原因:@Controller、@Service、@Repository、@Configuration都是根据@Component衍生的类(底层实现都是@Component),所以前四个注解功能都是一样的(可以替代使用),但是为了区分代码,我们需要分开使用
- 区别:@Controller注解用于处理HTTP请求和响应,所以如果当前代码想被外界访问到,就一定需要使用@Controller
- 为什么IDEA里代码都差不多,但@Controller有额外功能:在IDEA上我们看到的只是注解的定义,真正的功能实现在Spring的源码里
- 为什么IDEA里代码都差不多,但@Controller有额外功能:在IDEA上我们看到的只是注解的定义,真正的功能实现在Spring的源码里
- 共同点:都是告诉Spring帮我们管理对象
-
使用范围:自己的代码 + 类上
-
五大注解修饰的类,默认都是预加载,但我们可以设置为懒加载
-
使用类注解得到的Bean:哪怕我们用不同的方式去获取,得到的都是同一个对象
-
调用顺序:
类注解的使用
- 如何知道让Spring管理的对象是否已经被Spring管理起来了:用启动类的run方法获得容器后,用getBean()方法尝试从该容器获得被管理的对象
- SpringApplication.run():启动这个项目,返回值就是这个loC容器(即Spring的运行环境),用【ApplicationContext】接收
- ApplicationContext:统一翻译过来是【Spring上下文】,我们也可以个人理解为【应用环境】
- getBean()方法:常用的是下面这三种,s指的是Bean的名称,aClass指的是Bean的类型。名称需要参考下面【Bean的命名】
- getBean(String s,Class< T> aClass)
- getBean(String s):使用名称获取,因为返回对象是Object,所以需要强转
- getBean(Class< T> aClass)
- SpringApplication.run():启动这个项目,返回值就是这个loC容器(即Spring的运行环境),用【ApplicationContext】接收
-
关于Spring的扫描:在Spring项目中,当项目启动时,它会根据配置扫描特定的注解以自动注册和管理Bean
- 开始扫描:启动被@SpringBootApplication修饰的启动类后,会根据要扫描的包路径进行扫描(@ComponentScan),如果没有该注解,@SpringBootApplication会默认扫描启动类所在的包以及子包
- 扫描什么:Spring只处理有五大类注解的,比如@Data是Lombok提供的,SPring不会管
- 首先只扫描类,查找五大类注解,这些注解告诉Spring框架,这些类需要被你管理,应该被注册为Bean,在应用程序中可用
- 在有五大类注解的基础上,扫描其他与Bean管理相关的注解,如@Autowired
- 补充:当遇到其他如RequestMapping这种由其他模块提供的注解,也会由对应模块赋予其功能
-
关于扫描路径:
-
关于Bean的命名:
- Spring对Bean命名的处理:Spring在帮我们管理对象时,会给每一个对象起名字(默认情况),当然我们也可以自定义名字
- 命名规范:可以去Spring官方文档查看
- 使用小驼峰命名风格,遵循Java标准进行定义
- 如果类名前两位都为大写,如UService,Bean的名称为类名
- Bean名称的唯一性:因为我们可以根据名称拿到对象,所以名称要求是唯一的
- 原理:
- IDEA如何快速查找“方法和类”:双击shift输入名称搜索
- 关于定位当前类或方法所属于包:
- 关于IDEA的报错:报错只是指当前代码不符合规范,并不意味着不能运行。
- 怎么样才会提示报错:
- IDEA的提示报错是IDEA根据官方文档包括Spring等它们的规则检测后,如果它觉得当前做法不符合规则,就会报错。
- 但是不符合规则,不意味着真的错了,可能只是没有遵循官方推荐的方法
- 关于颜色:可以进行设置,所以控制台红色不意味着报错
- 怎么样才会提示报错:
- 代码格式化快捷键:Ctrl + Alit + L
- 类注解的使用:
@Controller
public class UserController {public void doController(){System.out.println("do Controller");}
}@SpringBootApplication
public class loCTest {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(loCTest.class, args);UserController userController = context.getBean(UserController.class);userController.doController();}}
4.2 方法注解@Bean
- 使用场景:
- 让Spring管理第三方Jar包:由于五大注解使用范围有限,假如我们引入了一个第三方Jar包,且也希望交给Spring管理,是无法使用五大注解的
- 引入配置:在Spring Framework时期是通过引入配置的方法引入
- 使用注解:Spring Boot提供了@Bean管理该包
- 需要多个对象:当一个类需要多个对象时,比如数据库操作需要多个数据源
- 让Spring管理第三方Jar包:由于五大注解使用范围有限,假如我们引入了一个第三方Jar包,且也希望交给Spring管理,是无法使用五大注解的
- 如何使用(不涉及传参):
- 使用@Bean可以定义多个对象
- 搭配五大注解使用:因为Spring扫描是需要五大注解告诉它们哪些类是需要其管理的,所以要搭配使用
- 获取Bean:
- 使用名称获取Bean:当定义了多个对象时,就无法用类型来获取Bean了,因为获取到Bean不是唯一的,Spring不知道要获取哪个。此时我们需要使用名称(当使用@Bean时,bean的名称就是方法名)来获取Bean
- 使用类型获取Bean:该类型只有一个的情况下,此时就不需要看名字,直接给赋值了。
@Data
public class UserInfo {private String username;private String password;
}
@Configuration
public class BeanConfig {@Beanpublic UserInfo userInfoZ(){UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangsan");userInfo.setPassword("123456");return userInfo;}@Beanpublic UserInfo userInfoL(){UserInfo userInfo = new UserInfo();userInfo.setUsername("lisi");userInfo.setPassword("123456");return userInfo;}
}
@SpringBootApplication
public class loCTest {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(loCTest.class, args);UserInfo userConfig = (UserInfo) context.getBean("userInfoZ");UserInfo userConfig1 = (UserInfo) context.getBean("userInfoL");System.out.println(userConfig == userConfig1); //结果为false}}
- 如何使用(涉及传参)
- 为什么要创建一个String对象:
- 在UserInfoW()中参数是一个String类型,对于Spring来说,bean也可以是String、Integer这种类型。此处如果没有创建一个String类型,Spring认为这里需要一个String类型的bean,但它没有找到,故而报错
- String会帮我们根据类型自动往里面注入对象,如果对应的对象只有一个,直接赋值。如果有多个,就会根据名称去匹配
- public UserInfo userInfoW(String nameZ):表示现在有一个叫userinfoW的UserInfo对象和里面一个叫nameZ的String对象要交给Spring管理,Spring需要把对象注入进去
- public String nameW:定义了一个叫nameW的String类型的对象
- 为什么要创建一个String对象:
@Configuration
public class BeanConfig {@Beanpublic UserInfo userInfoW(String nameZ){UserInfo userInfo = new UserInfo();userInfo.setUsername(nameZ);userInfo.setPassword("123456");return userInfo;}@Beanpublic String nameW(){return "wangwu";}@Beanpublic String nameZ(){ //定义了一个叫nameZ的String类型的对象return "zhaoliu";}
}
@SpringBootApplication
public class loCTest {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(loCTest.class, args);UserInfo userConfigW = (UserInfo) context.getBean("userInfoW");System.out.println(userConfigW.getUsername()); //zhaoliu}}
相关文章:

Spring ----> IOC
文章目录 一、 Spring 是一个包含众多工具的IoC容器二、 什么是IOC以及好处三、 如何实现loc思想四、Spring提供的实现loC的方法 --- 类注解方法注解4.1 类注解类注解概念介绍类注解的使用 4.2 方法注解Bean 一、 Spring 是一个包含众多工具的IoC容器 场景解析:首先…...

AI重塑保险业未来:机器学习在风险评估、欺诈检测与客户服务中的深度应用
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

某某某加固系统分析
某某某加固系统内核so dump和修复: 某某某加固系统采取了内外两层native代码模式,外层主要为了保护内层核心代码,从分析来看外层模块主要用来反调试,释放内层模块,维护内存模块的某些运行环境达到防止分离内外模块&am…...

嵌入式之音频基础知识
声音特性 1、响度:人主观上感觉声音的大小(俗称音量),由“振幅”和人离声源的距离决定,振幅越大响度越大,人和声源的距离越小,响度越大; 2、音调:声音的高低࿰…...
如何做好软件项目的沟通管理
如何做好软件项目的沟通管理 软件项目的沟通管理是确保项目信息在团队成员、利益相关者和相关群体之间有效流通的过程。良好的沟通是项目成功的关键,在项目开始时,需要制定详细的沟通计划,包括沟通的目的、对象、内容、频率和渠道等信息。 …...
linmux
了了了了了了了了了了了了了了...
Vue3学习-vue-router之路由传参
传参方案一:RouterLink 字符串 //传值 <RouterLink to"/page?a1&b2">{{ RouterLink 字符串传参 }}</RouterLink> //取值 import { toRefs } from vue import { useRoute } from vue-router const { query} toRefs(useRoute()) console.…...

ubuntu20.04 10分钟搭建无延迟大疆无人机多线程流媒体服务器
1.使用效果 无人机画面 2.服务器视频端口 3.使用教程 3.1.下载ubuntu对应软件包:系统要求ubuntu16以上 3.2修改端口(config.xml文件) 3.3启动服务 目录下输入:终端启动:./smart_rtmpd 后台启动:nohup ./…...

hugging face笔记:PEFT
1 介绍 PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数,并在其上添加少量可训练的参数(称为适配器)这些适配器被训练用来学习特定任务的信息。这种方法已被证明在内存效率和计算使用上非常高效,同时能产…...
作业5.26
定义一些常量和数据结构来存储用户信息和消息。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define MAX_USERS 100 // 最大用户数 #define MAX_M…...

银河麒麟服务器系统xshell连接之后主动断开,报错socket error event:32 Error:10053问题分析
银河麒麟服务器系统xshell连接之后主动断开,报错socket error event:32 Error:10053问题分析 一 问题描述二 系统环境三 问题分析3.1 与正常机器对比sshd文件内容以及文件权限3.2 检查同网段内是否配置多个相同的IP地址 四 后续建议 一 问题描…...

蓝桥杯算法心得——李白打酒(加强版)
大家好,我是晴天学长,记忆化搜索,找到技巧非常重要,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 2) .算法思路 1.memo三维表示记录的结果 3).算法步骤 1…...
java练习2
题目要求 创建一个Color枚举类有RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象Color有三个属性redValue,greenValue,blueValue创建构造方法,参数包括这三个属性每个枚举值都要给这三个属性赋值,三个属性对应的值分别是red&#…...

【安装笔记-20240523-Windows-安装测试 ShareX】
安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称:ShareX主页官方介绍 二、安装步骤测试版本:16.1.0下载链接功能界面 三、应用场景屏…...
2024年150道高频Java面试题(七十一)
141. spring cloud 的核心组件有哪些? Spring Cloud 是一个基于Spring Boot实现的微服务架构开发工具集,它为微服务架构中的诸多问题提供了解决方案。Spring Cloud的核心组件主要包括以下这些: Spring Cloud Config:提供服务器和…...

【深度学习】2.单层感知机
目标: 实现一个简单的二分类模型的训练过程,通过模拟数据集进行训练和优化,训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集,包括特征矩阵data_x和对应的标签数据data_y。标签…...
JS经常碰见的报错问题
语法错误:由于 JavaScript 是一种动态语言,因此编写代码期间可能会出现语法错误。这可能包括拼写错误、漏掉分号或括号等问题。 作用域问题:JavaScript 中存在全局作用域和局部作用域的概念,有时候可能会出现变量作用域混乱导致的…...
纯前端实现截图功能
纯前端实现截图功能 一、插件二、主要代码 一、插件 一、安装html2canvas、vue-cropper npm i html2canvas --save //用于将指定区域转为图片 npm i vue-cropper -S //将图片进行裁剪二、在main.js注册vue-cropper组件 import VueCropper from vue-cropper Vue.use(VueCropper…...

【网络协议】应用层协议--HTTP
文章目录 一、HTTP是什么?二、HTTP协议工作过程三、HTTP协议1. fiddler2. Fiddler抓包的原理3. 代理服务器是什么?4. HTTP协议格式1.1 请求1.2 响应 四、认识HTTP的请求1.认识HTTP请求的方法2.认识请求头(header)3.认识URL3.1 URL是什么&…...

【图书推荐】《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》
配套示例源码与PPT课件下载 百度网盘链接: https://pan.baidu.com/s/1nBQLd9UugetofFKE57BE5g?pwdqm9f 自学能力强的,估计不要书就能看代码学会吧。 内容简介 本书通过对Vue.js(简称Vue)的示例和综合案例的介绍与演练,使读者…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...