Spring ----> IOC

news2024/12/23 2:40:43

文章目录

  • 一、 Spring 是一个包含众多工具的IoC容器
  • 二、 什么是IOC以及好处
  • 三、 如何实现loc思想
  • 四、Spring提供的实现loC的方法 --- 类注解+方法注解
    • 4.1 类注解
      • 类注解概念介绍
      • 类注解的使用
    • 4.2 方法注解@Bean

一、 Spring 是一个包含众多工具的IoC容器

  1. 场景解析:首先我们已经了解到了【Spring】是一个框架,但这个概念依旧很笼统,Spring又究竟为什么有这么强大的能力,可以帮我们快速搭建项目 ------------> Spring 是一个包含众多工具的IoC容器(这个Spring实际是指Spring Core、Spring Framework这个原生的框架)
  2. 概念解析
    • 包含众多工具:我们可以通过Spring引入并管理依赖
    • 容器:是一个被用烂了的概念,我们可以通俗理解为【里面可以装东西】,Tomcat和List等都可以理解为一个容器
      • List/Map……:装数据的容器
      • Tomcat:装web的容器
      • Spring容器:装对象的容器。
        • 因为Spring是用来简化Java开发的框架,Java又是面向对象的,所以Spring是装对象的容器。
        • “对象”这个词,在Spring的范围内称为“bean”
    • loC:见下面

二、 什么是IOC以及好处

  1. loC是什么:控制(控制权)反转,是一种思想,Spring是其一种实现方式(具体表示为DI),下面讲解都以Spring为例子
    • 是什么控制权:这取决于实现方式,此处因为管理的是对象,所以控制权指的是【创建和拿出对象的控制权】
    • 控制权反转是什么意思:由【谁用谁创建,自给自足】,变为【由Spring帮我们统一创建】
      • 此处是BookController需要BookService对象,所以他自己创建了
      • 交给Spring后,BookController将不自己创建,而是只负责去Spring里拿(把创建的操作外包出去)
        在这里插入图片描述
  2. 为什么我们使用了Spring提供的注解,Spring就能帮我们完成对应操作:控制反转思想的体现
    • 以@RequestController注解为例,加了这个注解,相当于告诉Spring帮我们管理这个对象,后续访问的时候,要求能访问到
  3. loC的好处:减少模块之间的耦合
    • 如果自己创建,当被调用的类中出现了属性之类的修改,被调用方也需要跟着修改,代码修改量较大,耦合性较高
      在这里插入图片描述
      在这里插入图片描述

三、 如何实现loc思想

  1. 核心:交给别人去创建,自己只负责接收
  2. 方式一:手搓,需要自己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);
    }
}
  1. 方式二:Spring 提供的方法
  2. 为什么不用static解决loC问题:static是独立于整个类存在的,是所有对象共享的。而我们是需要给这个对象的某个属性赋值对象,两者不是一个概念

四、Spring提供的实现loC的方法 — 类注解+方法注解

4.1 类注解

类注解概念介绍

  1. 有什么:@Controller、@Service、@Repository、@Configuration、@Component

    • @Controller(控制器存储)、@Service(服务存储)、@Repository(仓库存储):分别对应了三层架构中的“Controller层”、“Service层”、“Dao层”
      • 数据库就是一个数据仓库
    • @Configuration(配置存储):Spring能帮我们管理的配置是大众使用的,如果是那种小众的,由于性价比低,Spring并未支持,此时就需要我们手动配置了
    • @Component(组件存储):让Spring帮我们管理组件相关的代码
  2. 类注解作用:方便区分(看到这个注解就可知道该代码属于哪一层)

    • 共同点:都是告诉Spring帮我们管理对象
      • 原因:@Controller、@Service、@Repository、@Configuration都是根据@Component衍生的类(底层实现都是@Component),所以前四个注解功能都是一样的(可以替代使用),但是为了区分代码,我们需要分开使用
    • 区别:@Controller注解用于处理HTTP请求和响应,所以如果当前代码想被外界访问到,就一定需要使用@Controller
      • 为什么IDEA里代码都差不多,但@Controller有额外功能:在IDEA上我们看到的只是注解的定义,真正的功能实现在Spring的源码里
        在这里插入图片描述
  3. 使用范围:自己的代码 + 类上

  4. 五大注解修饰的类,默认都是预加载,但我们可以设置为懒加载

  5. 使用类注解得到的Bean:哪怕我们用不同的方式去获取,得到的都是同一个对象
    在这里插入图片描述

  6. 调用顺序
    在这里插入图片描述

类注解的使用

  1. 如何知道让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)

在这里插入图片描述

  1. 关于Spring的扫描:在Spring项目中,当项目启动时,它会根据配置扫描特定的注解以自动注册和管理Bean

    • 开始扫描:启动被@SpringBootApplication修饰的启动类后,会根据要扫描的包路径进行扫描(@ComponentScan),如果没有该注解,@SpringBootApplication会默认扫描启动类所在的包以及子包
    • 扫描什么:Spring只处理有五大类注解的,比如@Data是Lombok提供的,SPring不会管
      • 首先只扫描类,查找五大类注解,这些注解告诉Spring框架,这些类需要被你管理,应该被注册为Bean,在应用程序中可用
      • 在有五大类注解的基础上,扫描其他与Bean管理相关的注解,如@Autowired
    • 补充:当遇到其他如RequestMapping这种由其他模块提供的注解,也会由对应模块赋予其功能
  2. 关于扫描路径
    在这里插入图片描述

  3. 关于Bean的命名

    • Spring对Bean命名的处理:Spring在帮我们管理对象时,会给每一个对象起名字(默认情况),当然我们也可以自定义名字
    • 命名规范:可以去Spring官方文档查看
      • 使用小驼峰命名风格,遵循Java标准进行定义
      • 如果类名前两位都为大写,如UService,Bean的名称为类名
    • Bean名称的唯一性:因为我们可以根据名称拿到对象,所以名称要求是唯一的
    • 原理
      • IDEA如何快速查找“方法和类”:双击shift输入名称搜索

在这里插入图片描述

  1. 关于定位当前类或方法所属于包
    在这里插入图片描述
  2. 关于IDEA的报错:报错只是指当前代码不符合规范,并不意味着不能运行。
    • 怎么样才会提示报错
      • IDEA的提示报错是IDEA根据官方文档包括Spring等它们的规则检测后,如果它觉得当前做法不符合规则,就会报错。
      • 但是不符合规则,不意味着真的错了,可能只是没有遵循官方推荐的方法
    • 关于颜色:可以进行设置,所以控制台红色不意味着报错
  3. 代码格式化快捷键:Ctrl + Alit + L
  4. 类注解的使用
@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

  1. 使用场景
    • 让Spring管理第三方Jar包:由于五大注解使用范围有限,假如我们引入了一个第三方Jar包,且也希望交给Spring管理,是无法使用五大注解的
      • 引入配置:在Spring Framework时期是通过引入配置的方法引入
      • 使用注解:Spring Boot提供了@Bean管理该包
    • 需要多个对象:当一个类需要多个对象时,比如数据库操作需要多个数据源
  2. 如何使用(不涉及传参)
    • 使用@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 {
    @Bean
    public UserInfo userInfoZ(){
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangsan");
        userInfo.setPassword("123456");
        return userInfo;
    }

    @Bean
    public 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

    }

}
  1. 如何使用(涉及传参)
    • 为什么要创建一个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类型的对象
@Configuration
public class BeanConfig {
    @Bean
    public UserInfo userInfoW(String nameZ){
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername(nameZ);
        userInfo.setPassword("123456");
        return userInfo;
    }

    @Bean
    public String nameW(){
        return "wangwu";
    }

    @Bean
    public 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

    }

}

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

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

相关文章

软件设计师备考 | 案例专题之数据库设计 概念与例题

相关概念 关注上图中的两个部分&#xff1a; 概念结构设计 设计E-R图&#xff0c;也即实体-联系图。 工作步骤&#xff1a;选择局部应用、逐一设计分E-R图、E-R图合并。进行合并时&#xff0c;它们之间存在的冲突主要有以下3类&#xff1a; 属性冲突。同一属性可能会存在于…

基于hive的酒店价格数据可视化分析系统设计和实现

摘要 本文基于Django框架和Hive技术&#xff0c;设计和实现了一种酒店价格数据可视化分析系 统&#xff0c;旨在为酒店管理者提供直观、清晰的数据洞察和决策支持。在研究中&#xff0c;首先深入分 析了酒店价格数据可视化分析系统的背景和意义&#xff0c;认识到对于酒店行…

【微积分】CH16 integrals and vector fields听课笔记

【托马斯微积分学习日记】13.1-线积分_哔哩哔哩_bilibili 概述 16.1line integrals of scalar functions [中英双语]可视化多元微积分 - 线积分介绍_哔哩哔哩_bilibili 16.2vector fields and line integrals&#xff1a; work circulation and flux 向量场差不多也是描述某种…

Study--Oracle-03-Oracle19C--RAC集群部署

一、硬件信息及配套软件 1、硬件设置 RAC集群虚拟机&#xff1a;CPU:2C、内存&#xff1a;9G、操作系统&#xff1a;30G、数据库安装目录&#xff1a;100G 数据存储&#xff1a;50G &#xff08;10G*5&#xff09; 共享存储&#xff1a;2G &#xff08;1G*2&#xff09; 2…

【C++STL详解(四)------vector的模拟实现】

文章目录 vector各函数接口总览vector当中的成员变量介绍默认成员函数构造函数1构造函数2构造函数3拷贝构造函数赋值运算符重载函数析构函数 迭代器相关函数begin和end 容量和大小相关函数size和capacityreserveresizeempty 修改容器内容相关函数push_backpop_backinserterases…

面试八股之JVM篇3.6——垃圾回收——强引用、弱引用、虚引用、软引用

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

Linux-命令上

at是一次性的任务&#xff0c;crond是循环的定时任务 如果 cron.allow 文件存在&#xff0c;只有在文件中出现其登录名称的用户可以使用 crontab 命令。root 用户的登录名必须出现在 cron.allow 文件中&#xff0c;如果这个文件存在的话。系统管理员可以明确的停止一个用户&am…

编程基础:掌握运算符与优先级

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、运算符的基石&#xff1a;加减乘除 二、比较运算符&#xff1a;判断数值大小 三、整除…

Postgresql源码(133)优化器动态规划生成连接路径的实例分析

物理算子的生成分为两步&#xff0c;基表的扫描路径生成set_base_rel_pathlists&#xff1b;连接路径生成&#xff08;make_rel_from_joinlist动态规划&#xff09;。本篇简单分析实现。看过代码会发现&#xff0c;“基表的扫描路径生成”其实就是作为连接路径生成dp计算的第一…

【Git】版本控制工具——Git介绍及使用

目录 版本控制版本控制系统的主要目标分类小结 分布式版本控制系统——GitGit特点Git与SVN的区别Git的工作机制 Git安装Git 团队协作机制团队内协作跨团队协作远程仓库远程仓库的作用有以下几个方面远程仓库操作流程/团队协作流程 Git分支什么是分支分支的好处 Git的常用命令Gi…

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…

JS根据所选ID数组在源数据中取出对象

let selectIds [1, 3] // 选中id数组let allData [{ id: 1, name: 123 },{ id: 2, name: 234 },{ id: 3, name: 345 },{ id: 4, name: 456 },] // 源数据let newList [] // 最终数据selectIds.map((i) > {allData.filter((item) > {item.id i && newList.pus…

Linux服务器安装docker,基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验 知识点 实验 查看yum源docker版本 dnf search docker安装docker dnf install dockerdocker --version

每日一题 包含不超过两种字符的最长子串

目录 1.前言 2.题目解析 3.算法原理 4.代码实现 1.前言 首先我打算介绍一下&#xff0c;我对滑动窗口的理解。 滑动窗口可以分为四个步骤&#xff1a; 进窗口&#xff1a; 在这一步骤中&#xff0c;我们决定了要在窗口中维护的信息。例如&#xff0c;在这个问题中&#xff…

java继承(构造器)使用细节3

那么我们怎么来选择用父类的 有参构造器 和无参构造器泥&#xff1f; 就可以不写 或只写super() 并且如像爸爸的爸爸还有爸爸&#xff0c;还有构造。所以会一直调用到爷爷的构造。 细节2 直接继承指的是儿子和爸爸&#xff0c;爸爸和爷爷

多项式重构的平滑和法线估计-------PCL

多项式重构的平滑和法线估计 /// <summary> /// 多项式重构的平滑和法线估计 /// </summary> /// <param name"cloud"></param> /// <returns>输出一个包含平滑后的点云数据以及相应法线信息的数据结构</returns> pcl::PointCl…

AI爆文写作:或许开放性的标题,才会更让人想点开了解答案

这是新华社公众号的一条推文 从信息传递上来说&#xff0c;新闻标题应该直接&#xff0c;包含关键信息。 但这个标题&#xff0c;却没有直接点名哪个国家&#xff0c;要点进去才能看到。 这就是要让人点开的标题特征&#xff0c;标题没有提供完整信息&#xff0c;是开放性的…

飞速提升中文打字,Master of Typing in Chinese for Mac助你一臂之力

Master of Typing in Chinese for Mac是一款专为Mac用户设计的中文打字练习软件。其主要功能包括帮助用户提高打字速度和准确性&#xff0c;培养盲打技巧&#xff0c;使键盘输入更加高效。 打字速度提升&#xff1a;软件提供多种练习模式&#xff0c;如字母、特殊字符、单词和…

Go语言实现人脸检测(Go的OpenCV绑定库)

文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集&#xff1a; 3.5 论文实验 3.6 解决的问题 3.7 论文总结 &#xff08;1&#xff09;文章优点 &#xff08;2&#xff09;方法创新点 &#xff08;3&#xff0…