【Springboot】关于Spring和SpringBoot的那些事儿

news2024/11/26 2:04:21

参考javaguide的学习笔记~

1 怎么那么多名字呀~

一开始看到这个图太劝退了,但实际上一开始只需要理解它是一个框架,包含很多个模块,能够简化开发。

使得接收HTTP请求,查数据库,写业务逻辑三部分能够分开。

并且能很方便地完成一些共同的逻辑。

Spring4.x主要模块

2 IOC

2.1 Why?为什么要交给外部管理?

IoC(Inversion of Control)的思想是,将原本在程序中手动创建对象的控制权,交给Spring框架来管理。

  • 控制:某一个类A创建另一个类的对象B,并对其进行管理的权力
  • 反转:把这种控制权交给外部环境,示例化和管理由外部环境完成(Spring框架、IoC容器)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kByQj1Qy-1687247653132)(【Springboot】关于SpringBoot的那些事儿/image-20230618181702034.png)]

如上图所示,传统的开发方式往往是在类A中通过new关键字来new一个B的对象出来。但按IoC的思想,IoC容器可以帮我们完成实例化对象,我们不必一遍又一遍地生产出Wheel类的示例,要使用某个对象时,直接从IoC容器里拿出来即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3arKMxBx-1687247653132)(【Springboot】关于SpringBoot的那些事儿/image-20230618184412701.png)]

比如,考虑这样一种情况,假如我们的车厂跟旧的车轮供应商闹掰了,想要把所有的轮子,全换成另一个供应商的轮子。按照旧的实现方式,我们需要把车厂中的所有车的旧轮子实例化改过来。

如果有很多个类都引用了OldWheel的具体实例化,修改起来将会非常复杂和痛苦:你不仅需要知道哪些地方引用了OldWheel,还需要知道NewWheel的构造函数需要什么参数,而更糟糕的是,这些参数有可能又有它们自己的构造函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9FDAR0s-1687247653133)(【Springboot】关于SpringBoot的那些事儿/image-20230618185432032.png)]

而使用IoC的思想,我们把对象的控制权交给IoC容器管理,在使用时直接向IoC要就好了,小车类中的代码没有改动与变化。它把你从复杂的依赖关系中拯救出来,你完全不用考虑对象是如何被创建的。

3 Spring Bean是什么东东?

简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。

我们需要通知 IoC 容器帮助我们管理哪些对象,这种“通知”可以通过 XML 文件、注解或者 Java 配置类实现。

【我还是没有搞清楚BeanFactory巴拉巴拉的工作流程,但是啊,但是,我感觉框架存在的意义,就是我没必要知道这些东西是怎么工作的啊】

3.1 将一个类声明为 Bean 的注解有哪些?

@Component@Repository@Service@Controller
  • @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

  • @Repository : 对应持久层 (Dao 层) ,主要用于数据库相关操作。可以看到其实现方式与@Component相同,只是明确这个类对数据库有CRUD的功能。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Repository {
        @AliasFor(
            annotation = Component.class
        )
        String value() default "";
    }
    
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

  • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

3.2 @Mapper和@Repository的区别?

@Mapper是Mybatis自带的一个注解。不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,Spring将动态生成Bean后注入到ServiceImpl中。@MapperScan 加在启动类上可以替代 @Mapper,把一个包里的内容都声明为Mapper

@Repository是Spring提供的一个注解,用于声明一个Bean。在直接使用JDBC开发时可能会用到(然鹅现在大多都直接MyBatis)。

简单理解就是:@Mapper = @MapperScan(自动扫描配置)+Repository(可省略)

3.3 @Component和@Bean的区别?

@Component 注解作用于类,而@Bean注解作用于方法。

  • @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径)。
  • @Bean 注解告诉了 Spring 这个方法将返回一个对象,这个对象要注册为Spring中的Bean,当我需要用它的时候还给我。

@Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

@Bean注解使用示例,按条件注入组件:

 	@Configuration
    public class MyConfiguration {
        @Bean
        public User user() {
        	int i = 10;
        	if(i < 7) {
        		return new User("jack", 20);
      		} else {
      			return new User("david", 18);
      		}
        }
    }
	@Autowired
	private User user; // 将在IOC容器中寻找User对象

3.4 注入Bean的注解有哪些?

Spring 内置的 @Autowired 以及 JDK 内置的 @Resource@Inject 都可以用于注入 Bean。

AnnotaionPackageSource
@Autowiredorg.springframework.bean.factorySpring 2.5+byType
@Resourcejavax.annotationJava JSR-250byName
@Injectjavax.injectJava JSR-330

@Autowired@Resource使用的比较多一些。

3.5 @Autowired 和 @Resource 的区别是什么?

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
  • 当一个接口存在多个实现类的情况下,@Autowired@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显式指定名称,@Resource可以通过 name 属性来显式指定名称。

1 @Autowired -> byType

Autowired 属于 Spring 内置的注解,默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。

这会有什么问题呢? 当一个接口存在多个实现类的话,byType这种方式就无法正确注入对象了,因为这个时候 Spring 会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。

这种情况下,注入方式会变为 byName(根据名称进行匹配),这个名称通常就是类名(首字母小写)。就比如说下面代码中的 smsService 就是我这里所说的名称,这样应该比较好理解了吧。

// smsService 就是我们上面所说的名称
@Autowired
private SmsService smsService;

举个例子,SmsService 接口有两个实现类: SmsServiceImpl1SmsServiceImpl2,且它们都已经被 Spring 容器所管理。

// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;

// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;

// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

我们还是建议通过 @Qualifier 注解来显式指定名称而不是依赖变量的名称。

2 @Autowired -> byType

@Resource属于 JDK 提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType

@Resource 有两个比较重要且日常开发常用的属性:name(名称)、type(类型)。

  • 如果仅指定 name 属性则注入方式为byName
  • 如果仅指定type属性则注入方式为byType
  • 如果同时指定nametype属性(不建议这么做)则注入方式为byType+byName
// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;

// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;

// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

3.6 Bean 的作用域有哪些?

可以通过@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)注解配置Bean的作用域。

Spring 中 Bean 的作用域通常有下面几种:

  • singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
  • prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。
  • request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
  • session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
  • application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
  • websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。

3.7 Bean 的生命周期?

  • Bean 容器找到配置文件中 Spring Bean 的定义。
  • Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。
  • 如果涉及到一些属性值 利用 set()方法设置一些属性值。
  • 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的名字。
  • 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
  • 如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入 BeanFactory对象的实例。
  • 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
  • 如果 Bean 实现了InitializingBean接口,执行afterPropertiesSet()方法。
  • 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
  • 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  • 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

Spring Bean 生命周期

4 Spring MVC的工作原理

Spring MVC 下我们一般把后端项目分为 :

  • Controller 层(控制层,返回数据给前台页面)
  • Service 层(处理业务)
  • Dao 层(数据库操作)
  • Entity 层(实体类)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g9gk7VfU-1687247653133)(【Springboot】关于SpringBoot的那些事儿/image-20230618224601649.png)]

  1. 用户发送Request请求, 被前置控制器DispatcherServlet接收。

    • DispatcherServlet核心的中央处理器,接收请求、分发请求、响应结果,返回结果可以是json、String等数据类型,也可以是页面。
  2. DispatcherServlet 根据请求信息调用 HandlerMappingHandlerMapping 根据 url 去匹配查找能处理的 Handler(即Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。

    • mappedHandler = this.getHandler(processedRequest);
      
      HandlerExecutionChain handler = mapping.getHandler(request);
      
  3. DispatcherServlet 调用 HandlerAdapter适配器执行 Handler

    • 使用适配器就可以执行多种不同的Handler啦。
  4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet

    • ModelAndView 包含了数据模型以及相应的视图的信息。

    • mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
      
  5. 视图解析器ViewResolver 根据ModelAndView 来解析实际的 View,返回给DispatherServlet

    view = mv.getView();
    
  6. DispaterServlet 渲染 View并返回给请求者(浏览器)

    view.render(mv.getModelInternal(), request, response);
    

下图展示了调用某个Controller时的栈,可以看到上述提及的各个类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iVFLOp9-1687247653133)(【Springboot】关于SpringBoot的那些事儿/image-20230618212657147.png)]

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

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

相关文章

【2023最全最叼教程】Selenium 自动化测试环境搭建

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。本文详细介绍了搭建自动化测试环境所需的工具&#xff0c;让你学习自动化测试不…

人脸检测——基于机器学习3】AdaBoost算法

简介 主要工作AdaBoost算法的人脸检测算法包含的主要工作:(1)通过积分图快速求得Haar特征;(2)利用AdaBoost算法从大量的特征中选择出判别能力较强的少数特征用于人脸检测分类;(3)提出一个级联结构模型,将若干个弱分类器集成一个强分类器,其能够快速排除非人脸区域,…

系统架构设计师-系统工程与信息系统基础(2)

一、电子政务类型 电子政务主要有3类角色&#xff1a;政府&#xff08;Government&#xff09;、企&#xff08;事&#xff09;业单位&#xff08;Business&#xff09;及公民&#xff08;Citizen&#xff09;。如果有第4类就是公务员&#xff08;Employee&#xff09;。 二、企…

CMIP6降尺度方法

气候变化关系到农业、生态系统、社会经济和人类生存与发展&#xff0c;是当今世界关注的重点问题之一。IPCC&#xff08;Intergovernmental Panel on Climate Change&#xff09;第6次评估报告指出&#xff0c;自 20 世纪 50 年代以来&#xff0c;从全球平均气温和海温升高、大…

Unity核心10——导航寻路系统

Unity 中的导航寻路系统是能够让我们在游戏世界当中&#xff0c;让角色能够从一个起点准确的到达另一个终点&#xff0c;并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往 ​ Unity 中的导航寻路系统的本质&#xff0c;就是在 A 星寻路算法的基础上进行了拓展和…

国家加强互联网广告监管

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 5月1日《互联网广告管理办法》正式实施。 6月19日&#xff0c;市场监督总局要求加强广告监管。 主要针对直播带货广告、弹窗广告、“软文”广告等新型广告形式&#xff0c;加大互联网广告乱象清理…

HDLBits自学笔记3:Verilog language.Modules Hierarchy

Modules 在顶层模块中实例化模块mod_a&#xff0c;其端口描述&#xff1a; module mod_a ( input in1, input in2, output out ); module top_module ( input a, input b, output out );// 按信号名称连线mod_a u1(.in1(a),.in2(b),.out(out));// 按信号位置连线// mod_a u…

基于数据驱动 U-Net 模型的大气污染物扩散快速预测,提升计算速度近6000倍

项目背景 当前&#xff0c;常见的大气污染预测模型大多是基于物理机理构建的&#xff0c;比如空气质量预测模型 Calpuff、AERMOD、CMAQ 等。然而&#xff0c;这些模型运算较为复杂&#xff0c;对于输入数据的要求非常高&#xff0c;运算耗时也比较长&#xff0c;适合用于常规固…

【玩转Docker小鲸鱼叭】Docker镜像常用命令汇总

镜像是Docker中最为核心也是最具创造性的概念&#xff01;在理解Docker的核心概念文章中&#xff0c;我们理解了镜像的含义&#xff0c;下面让我们一起操作一些镜像&#xff0c;包括拉取、推送镜像等操作。 1、镜像支持哪些命令 通过 docker image help 查看 Docker 支持的镜像…

联想U盘重装系统Win10步骤和详细教程

最近很多用户都在问怎么利用U盘来给联想电脑重装Win10系统&#xff0c;用户需要准备一个8G以上的U盘&#xff0c;确保联想电脑能够正常联网&#xff0c;然后按照小编给大家分享的联想U盘重装系统Win10步骤和详细教程操作&#xff0c;即可快速轻松完成联想电脑Win10系统的重装。…

C++——cin输入

cin对象在抽取过程中会进行类型转换&#xff0c;这应该是根据字节数来的&#xff0c;对于每一种类型&#xff0c;都会有相应的指令合集&#xff0c;也就是cpu会按字节进行转换&#xff0c;区别在于大端模式或者是小端模式&#xff0c;cin对象从在了<<相应的函数被称为格式…

陪诊APP开发服务兼职软件

陪诊APP是一种提供陪伴照顾服务的应用程序&#xff0c;主要面向需要医院陪护的病人及家属。以下是可能有助于陪诊APP开发服务兼职软件的功能&#xff1a; 注册和登录&#xff1a;允许用户使用手机号码等方式注册并登录账户。 病房预约&#xff1a;允许家属为病人预约病…

数据烦恼?亮数据平台为你提供一站式解决方案

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 在当今数字时代&#xff0c;大型和实时的数据集具有更全面的信息、更准确的预测、和更好的竞争优势。作为一位刚被数据折磨过的人&#xff0c;我必须要把自己的经验跟大家分享一下&#xff0c;让大家和公司在收集数据方面…

构筑数字化新引擎!美创助力金华银行核心系统国产分布式数据库迁移

近日&#xff0c;金华银行举行“星辉工程”核心项目群上线发布会&#xff0c;新一代核心系统成功部署在国产分布式数据库OceanBase&#xff0c;向业务高效创新、数智赋能迈出了重要一步。据悉&#xff0c;这是浙江省首例基于完全国产自研数据库落地的银行核心系统。 此次“星辉…

[PyTorch][chapter 43][时间序列表示方法1]

前言&#xff1a; 语言模型&#xff08;LM&#xff09;起源于语音识别(speech recognition)&#xff0c;输入一段音频数据&#xff0c;语音识别系统通常会生成多个句子作为候选&#xff0c;究竟哪个句子更合理&#xff1f;就需要用到语言模型对候选句子进行排序。 language mod…

【算法题解】40. 数组的度

这是一道 简单 题 https://leetcode.cn/problems/degree-of-an-array/ 题目 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返…

谈找工作途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉钩 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…

QT日历制作

文章目录 前言一、QCalendar 类介绍二、界面布局三、代码讲解1. lable 添加图片2. 设置主窗口背景色3. 日历显示改变网格线颜色4. 显示表头日期 总结 前言 在 Qt 中&#xff0c;QCalendar 类是提供日历功能的类。它用于操作和管理日期和时间信息&#xff0c;包括日期计算、日期…

为什么黑客不黑赌博软件?如何成为一名顶级黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

JDK新手无脑安装配置教程❤❤❤ JDK下载网址 ps&#xff1a;如果你的JDK版本在官网没有找到&#xff0c;可以通过第三方资源进行下载&#xff0c;下载安装配置教程是通用的 官方链接>https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 安装步骤…