八股总结(八)SSM框架体系

文章目录

  • Spring基础
    • 1、Spring、SpringMVC、Mybatis与SpringBoot的区别
    • 2、Spring中常用的注解及作用
  • Spring IoC 、 DI、Bean
    • 3、Spring IoC是什么,有什么好处,Spring中是怎么实现的?
    • 4、Bean相关
      • 5、@Component 和 @Bean 的区别是什么?
      • 6、注入Bean的注解有哪些,@Autowired与@Resource的区别在哪?
      • 7、Bean是线程安全的吗?
      • 8、Bean的生命周期是怎么样的?
  • Spring AoP
  • Spring MVC
  • SpringBoot
  • Mybatis

Spring基础

1、Spring、SpringMVC、Mybatis与SpringBoot的区别

  • Spring是一个轻量级的Java企业级开发框架,提供了很多功能和特性,如:
    • 控制反转(IOC)
    • 依赖注入(DI)
    • 面向切面编程(AOP)
    • Spring事务管理
  • Spring MVC则是Spring框架的一部分,专注于Web应用程序的开发,提供如下功能:
    • 接收请求
    • 设置请求拦截器
    • 响应数据
    • 全局异常处理
  • Mybatis则是数据持久层框架,与数据库打交道,可以使用简单的XML或者注解配置和映射数据库表格中的原始信息,完成系统中Java实体类与数据库中记录的映射
  • Spring Boot是一个简化了Spring应用开发的框架,通过起步依赖和自动配置,大大简化了spring配置的流程,使得开发者可以更专注于业务逻辑的实现。

在这里插入图片描述

2、Spring中常用的注解及作用

  1. 配置Bean相关:
  • @Autowire:让Spring容器自动装配Bean到类中。
  • @ComponentScan:通过自动扫描机制来发现和注册满足条件的组件。
  • @Configuration:用于指定配置类,替代传统的XML配置文件。
  • @Bean:用于在@Configuration类中声明Bean定义,供Spring容器管理。
  • @Qualifier:与@Autowired一起使用,通过指定Bean名称解决自动装配的歧义性。
  • @Value:用于注入简单值或表达式到Bean的属性。
  • @Scope:用于指定Bean的作用域,如单例(Singleton)或原型(Prototype)。
  • @ConfigurationProperties:用于绑定配置文件中的属性到Java类的字段上,支持批量绑定。
  1. SpringMVC相关:
  • @Component:通用注解,标明该类是应该交由Spring管理的。如果一个Bean不知道属于哪个层,使用该注解。
  • @RequestMapping:用于将HTTP请求映射到控制器的处理方法,例如:@RequestMapping(“/books”)
  • @PathVariable:用于获取URL路径变量值并映射到方法参数。
    // 处理URL: /books/{id}
    @GetMapping("/{id}")
    public String getBookById(@PathVariable Long id) {
        // 处理方法逻辑
        return "book_details";
    }
  • @RequestParam:用于获取请求参数的值并映射到方法参数。
    // 处理URL: /books?category=fiction
    @GetMapping
    public String getBooksByCategory(@RequestParam("category") String category) {
        // 使用category进行业务逻辑处理
        // ...
        return "books_by_category";
    }
  • @ResponseBody:用于将方法返回值直接作为HTTP响应的内容返回。
@RestController
@RequestMapping("/api")
public class BookController {

    @PostMapping("/books")
    public ResponseEntity<String> createBook(@RequestBody Book book) {
        // 处理从请求体中解析出来的 Book 对象
        // ...
        return new ResponseEntity<>("Book created successfully", HttpStatus.CREATED);
    }
}
  • @Controller:控制层注解,处理HTTP请求并返回响应。此外还有@RestController注解,它是@Controller和@ResponseBody的合集。
  • @Service:用于标识服务层类,通常用于注解Service组件。
  • @Repository:用于标识数据访问层类,通常用于注解DAO组件。
  • @Transactional:用于标识事务方法,启用方法级别的事务管理。

Spring IoC 、 DI、Bean

3、Spring IoC是什么,有什么好处,Spring中是怎么实现的?

IoC(Inversion of Control:控制反转) 是一种设计思想,是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,即将对象的创建和管理的权力交由Spring容器。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/=或者注解即可,完全不用考虑对象是如何被创建出来的。简化应用开发,利用实现分层解耦。

在这里插入图片描述

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value)注册表,Map 中存放的是各种Bean对象,key就是Bean的名称(或ID),value 是 Bean 的定义信息,包括类名、依赖关系、初始化方法、销毁方法等。

4、Bean相关

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

Bean的配置可以通过XML文件配置,也可以通过注解在设置。比如:

  • @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用* @Component 注解标注。
  • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
  • @Repository(仓库) : 对应持久层即 Dao 层,主要用于数据库相关操作。

5、@Component 和 @Bean 的区别是什么?

  1. @Component 注解作用于类,而@Bean注解作用于方法。
  2. @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。
  3. @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

6、注入Bean的注解有哪些,@Autowired与@Resource的区别在哪?

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

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。Autowired 默认的注入方式为byType(根据类型进行匹配),
  • @Resource默认注入方式为 byName(根据名称进行匹配)。

当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。

  • @Autowired 可以通过 @Qualifier 注解来显式指定名称
  • @Resource可以通过 name 属性来显式指定名称。

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

// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;


// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

7、Bean是线程安全的吗?

Spring 框架中的 Bean 是否线程安全,取决于其作用域和状态。

在多例(prototype)的作用域下,每次获取都创建一个新的bean实例,不存在资源竞争问题,所有没有线程安全问题。

在单例(singleton)作用域下,IoC容器只有唯一的bean实例,可能存在资源竞争问题,如果bean有状态即包含可变的成员变量,那么就存在线程安全问题。

对于有状态且为单例Bean的线程安全问题,常见的有两种解决办法:

  1. 在Bean中尽量避免定义可变的成员 变量
  2. 在类中定义ThreadLocal,将需要的成员变量保存在TheadLoacl使其线程私有化。

8、Bean的生命周期是怎么样的?

  1. IoC容器找到配置文件中Spring Bean的定义
  2. IoC容器利用Java 反射创建一个Bean的实例
  3. 如果涉及到一些Bean的属性赋值如使用了@Value注解,则利用set()方法设置属性值。
  4. 如果Bean实现了BeanNameAware接口,则调用setBeanName方法,传入Bean的名字。Aware接口是在编译阶段内置在Bean中,用来与IoC容器打交道,获取Bean的相关信息时用的。4 - 7 都是一些Aware接口,了解Aware接口的概念即可,不用记得那么细致。
  5. 如果Bean实现了BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
  6. 如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入 BeanFactory对象的实例。
  7. 如果实现了其他 *.Aware接口,就调用相应的方法。
  8. 如果有和加载这个Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法。即初始化前的Bean后处理器
  9. 如果 Bean 实现了InitializingBean接口,执行afterPropertiesSet()方法。InitializingBean是与Aware类似 的接口,是与Bean耦合的,InitializingBean接口会执行初始化逻辑
  10. 如果 Bean 在配置文件中的定义包含 init-method 属性,则执行init-method 指定的方法。8 - 10 是Bean初始化时可以设置的三种回调,它们的顺序分别是 Bean初始化前的后处理器、InitializingBean内置接口、配置属性init - method
  11. 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法即销毁前的Bean后处理器
  12. 如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。DisposableBean 接口是与InitializingBean类似的耦合接口
  13. 如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。11-13是与初始化时相对应的,在销毁前的3种回调,它们的执行顺序与初始化是一样的,即 后处理器 、耦合接口、配置属性

上边列举的Bean的生命周期有点儿过长了:
简单来记忆:

Bean生命周期的主要脉络包括:

  • 1、Bean配置
  • 2、Bean实例化
  • 3、Bean初始化
  • 5、Bean的使用
  • 4、Bean销毁

展开来讲包括:

  • 1、找到配置文件中Bean定义
  • 2、基于反射实例化Bean
  • 3、如果Bean实现了Aware相关耦合接口,则执行对应实现方法
  • 4、Bean初始化:
    • Bean后处理器:前置处理
    • 耦合接口: InitializingBean
    • Bean配置属性:init-method指定的方法
    • Bean后处理器:后置处理
  • 5、Bean的使用
  • 6、Bean销毁:
    • Bean后处理器:销毁前置处理
    • 耦合接口: DisposableBean
    • Bean配置属性:destroy-method指定的方法
      在这里插入图片描述

Spring AoP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring MVC

SpringBoot

Mybatis

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

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

相关文章

Java-简单认识类和对象

一、初步认识面向对象 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思…

系统架构设计师 10:软件架构的演化和维护

一、软件架构演化 如果软件架构的定义是 SA{components, connectors, constraints}&#xff0c;也就是说&#xff0c;软件架构包括组件、连接件和约束三大要素&#xff0c;这类软件架构演化主要关注的就是组件、连接件和约束的添加、修改与删除等。 二、面向对象软件架构演化…

使用Appuploader工具将IPA上传到App Store的最新流程和步骤

​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader 可以在 mac 和windows 上制作管理 证书 &#xff0c;无需钥匙串工具 条件&#xff1a;1.以Windows为例&#xff0c;创建app打包ios需要的证书和描述文件 2.准备好一个苹果开发者账号&#xff08;如果没有到苹果…

C#实现读写CSV文件的方法详解

目录 CSV文件标准 文件示例RFC 4180简化标准读写CSV文件 使用CsvHelper使用自定义方法总结 项目中经常遇到CSV文件的读写需求&#xff0c;其中的难点主要是CSV文件的解析。本文会介绍CsvHelper、TextFieldParser、正则表达式三种解析CSV文件的方法&#xff0c;顺带也会介绍一…

QGIS3.28的二次开发一:编译工程

环境&#xff1a;VS2019OSGeo4WCMake_3.26Cygwin64QGIS_3.28 注意&#xff1a;一定要按照步骤顺序来&#xff01; 一、配置环境 &#xff08;一&#xff09;VS2019 VS2019下载链接https://my.visualstudio.com/Downloads?qvisual%20studio%202019&wt.mc_ido~msft~vsco…

Java面向对象编程实战详解(图书管理系统示例)

文章目录 面向编程概念图书管理系统示例需求分析设计阶段编码实现创建目录结构Book类的编码BookList类的编码User类的编码AdminUser类的编码NormalUser类的编码启动类的编写具体的操作实现IOperation接口新增图书的实现借阅图书的实现删除图书的实现显示图书的实现查找图书的实…

1.netty介绍

1.介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty 2.应用…

一文讲清楚地图地理坐标系

前言 我最近在做一个和地图有关的项目&#xff0c;这里本人地图采用的是mapbox&#xff0c;其中涉及一个功能需要根据用户输入的地点直接定位到地图上的对应的位置&#xff0c;本人开始想的是直接调用百度的接口根据地名直接获取坐标&#xff0c;发现在地图上的位置有偏移不够…

一、Postfix[安装与配置、smtp认证、Python发送邮件以及防垃圾邮件方法、使用腾讯云邮件服务]

Debian 11 一、安装 apt install postfix 二、配置 1.dns配置 解释&#xff1a;搭建真实的邮件服务器需要在DNS提供商那里配置下面的dns 配置A记录mail.www.com-1.x.x.x配置MX记录www.com-mail.www.com 解释&#xff1a;按照上面的配置通常邮件格式就是adminwww.com其通过…

使用BERT分类的可解释性探索

最近尝试了使用BERT将告警信息当成一个文本去做分类&#xff0c;从分类的准召率上来看&#xff0c;还是取得了不错的效果&#xff08;非结构化数据强标签训练&#xff0c;BERT确实是一把大杀器&#xff09;。但准召率并不是唯一追求的目标&#xff0c;在安全场景下&#xff0c;…

python 自动化数据提取之正则表达式

>>>> 前 言 我们在做接口自动化的时候&#xff0c;处理接口依赖的相关数据时&#xff0c;通常会使用正则表达式来进行提取相关的数据&#xff0c;今天在这边和大家聊聊如何在python中使用正则表达式。 正则表达式&#xff0c;又称正规表示式、正规表示法、正规…

K8S:容器日志收集与管理

Kubernetes 里面对容器日志的处理方式&#xff0c;都叫作 cluster-level-logging&#xff0c;即&#xff1a;这个日志处理系统&#xff0c;与容器、Pod 以及 Node 的生命周期都是完全无关的。这种设计当然是为了保证&#xff0c;无论是容器挂了、Pod 被删除&#xff0c;甚至节点…

RabbitMQ部署指南

RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 已经提供了镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载镜像即可&…

文档管理NAS储存安全吗?

关键词&#xff1a;私有化、知识管理系统、文档管理、群晖NAS、协同编辑 随着企业不断发展扩大&#xff0c;企业的知识文档也逐渐增多&#xff0c;很多企业方便管理及考虑数据安全问题会将文件数据储存至NAS。 但将企业文档数据放在NAS上就足够安全的吗&#xff1f; 天翎文档管…

集成学习概述

集成学习 1. 集成学习概念 集成学习是解决有监督机器学习任务的一类方法,它的思路是基于多个学习算法的集成来提升预测结果,它通过多个模型的组合形成一个精度更高的模型,参与组合的模型成为弱学习器(基学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知的样本…

yolov8系列[五]-项目实战-yolov8模型无人机检测

yolov8系列[五]-项目实战-yolov8模型无人机检测 项目介绍项目展示功能简介代码结构如何启动 开发者模式1. 安装依赖环境2. 启动程序 源代码下载其他 项目介绍 无人机识别项目,无人机搭载nvidia jetson边缘计算板子,进行实时识别。使用yolov8算法&#xff0c;训练了识别无人机的…

用于永磁同步电机驱动器的自适应SDRE非线性无传感器速度控制(MatlabSimulink实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码&Simulink仿真实现 &#x1f4a5;1 概述 本文方法基于状态依赖的里卡蒂方程&#xff08;SDRE&#xff09;控制技术及其梯度型神经网络的实时计算方法&#xff0c;允许…

c++里的基础类 is_empty_v<_Ty1>

&#xff08;1&#xff09;为什么要研究这个问题&#xff0c;因为包括智能指针等很多源代码里都会使用 _Compressed_pair 这个类&#xff0c;其是一对值。研究这个类&#xff0c;就牵涉另一个更基础的类 is_empty_v<_Ty1> &#xff08;2&#xff09; is_empty_v<_Ty1&…

APP自动化测试-Python+Appium+Pytest+Allure框架实战封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest只是单独的…

西安电子科技大学

前言 本篇文章投稿与以下活动 【西安城市开发者社区】探索西安高校&#xff1a;展现历史与创新的魅力 资料参考与百度百科 学校简介 西安电子科技大学&#xff08;Xidian University&#xff09;&#xff0c;简称“西电”&#xff0c;位于陕西省西安市&#xff0c;是中央部…
最新文章