• 项目-SpringBoot


    文章目录

    什么是SpringBoot?

    • 概念:
      Spring Boot是Spring组织下的子项目,用于简化Spring应用初始框架搭建以及开发过程;
      是一个简单javaweb框架,具有简化开发、约定大于配置的优点。

    • 核心 :
      = 定义了特定的方式进行配置,不需要开发人员定义样板化的配置;
      只要存在对应的jar包,Spring就会自动配置;

    • 理解:
      并不是新的框架,类比Maven,Maven整合了所有的jar包,SpringBoot整合了所有框架;

    扩展
    jar = 一种软件包的格式,用于聚合大量的Java类文件、相关的元数据和资源文件到一个文件,以便于Java平台的应用;

    SpringBoot自动配置原理是什么?

    自动配置的理解要从应用出发,SpringBoot需要两个配置文件:application.properties和Pom.xml
    SpringBoot的启动过程:
    涉及到的注解:SpringBootApplication、SpringBootConfiguration、ConponentScan、EnableAutoConfiguration;
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    • 整个过程主要分成加载所有的配置类:
      @SpringBootApplication是源配置类,先导入原配置类的配置类;
      @ComponentScan来加载com.example.alipay路径下的包;
      @EnableAutoConfiguration注解,使用spring factory机制来加载第三方的jar包的配置类,本质是通过@import来导入第三方配置类;
      所有类加载好了,再去实例化这些bean,将这些bean注册到IOC中;

    理解起来有点困难:
    具体代码执行过程:
    代码的启动类文件中有核心注解SpringBootApplication,main方法中有SpringApplication.run方法执行;
    进入SpringApplication类中,有prepareContext完成自动装配,点击进入prepareContext,最终会找到load方法;
    load方法内,创建BeanDefinitionLoader定义bean对象的加载器,完成这些对象的加载和注入功能;
    而prepareContext的load方法最终执行的是BeanDefinitionLoader中的load方法,将加载入的对象进行一系列的识别,看是否可以将注解的标识加载回来;接下来判断资源类型,看使用groovy或者注解加载;
    寻找启动类是否有@Component,通过SpringBootApplication→SpringBootConfiguration→Configuration→Conponent
    isEligible方法,找到注解之后会把该对象注册到AnnotatedBeanDefinitionReader对象中;
    以上内容内容启动对象的注入;

    SpringBoot的优点?

    • 搭建简单,开箱即用:
      不使用SpringBoot时候,要搭建一个Spring/SpringMVC项目,需要开放接口;要配置servlet;要使用IOC,得在xml里配置各种bean;要本地调试,得配置tomcat;

    • 简化配置,专属编码:
      SpringBoot可以根据当前类路径下的类、jar包来自动配置bean;
      想使用异步化,加个@EnableAsync就可以开启异步化功能;想使用定时任务,加个@EnableScheduling就可以使用开启定时任务功能;
      想使用AOP,加个@Aspect就可以各种拦截了;添加一个spring-boot-starter-web启动器就能拥有web的功能;
      过程简单,配置过程无代码生成,无需XML配置文件;避免大量的Maven导入和各种版本冲突;

    • 可独立运行:
      Spring Boot 中内嵌了各种 servlet 容器、Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中;
      Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。

    SpringBoot的缺点?

    任何技术都会有缺点,能解决一切问题的技术不存在;
    目前存在的缺点就是入门简单,强大的封装功能,使得学习者无法清楚理解内部原理。

    Spring Boot的核心配置文件有哪几个?它们的区别是什么?

    Spring Boot的核心配置文件有 bootstrap.properties 和 application.properties;

    两者的区别:

    区别bootstrap.propertiesapplication.properties
    作用在应用程序上下文的引导阶段生效,由父 ApplicationContext加载
    主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性
    其中的属性不能被覆盖
    由ApplicationContext加载
    主要用于SpringBoot 自动化配置文件
    加载顺序先加载后加载

    Spring Boot的配置文件有哪几种格式?它们有什么区别?

    Spring Boot 配置文件的格式有三种:.properties 、 .yml、.yaml

    区别

    • 三种配置文件的格式不同;
    案例:改端口号;
    .properties
    server.port = 80
    
    .yml
    server:
    	port:80
    
    .yaml
    server:
    	port:80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三个配置文件的优先级不同
    properties > yml > yaml

    Spring Boot的核心注释是哪个?它主要由哪几个注释组成的?

    启动类上面的注解@SpringBootApplication

    由三个注解组成:
    @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
    @SpringBootConfiguration = 组合了@Configuration,实现配置文件;
    @EnableAutoConfiguration = 打开自动配置的功能,也可以关闭某个自动配置的选项

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class });
    
    • 1

    @ComponentScan = 使spring Boot扫描到Configuration类,并把它加入到程序上下文。

    开启Spring Boot特性有哪几种方式?

    有两种方式:
    继承spring-boot-starter-parent项目
    导入spring-boot-dependencies项目依赖

    • 继承spring-boot-starter-parent项目
      具体的代码书写在pom文件中。
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starterartifactId>
        <version>2.1.5.RELEASEversion>
    parent>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    导入spring-boot-dependencies项目依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>1.5.6.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    什么是JavaConfig?

    • 概念:
      基于Java配置的spring,提供了配置 Spring IoC 容器的纯Java 方法,使用JavaConfig可以替代XML;

    • 优势:

    面向对象配置
    配置被定义为JavaConfig中的类,则一个配置就可以继承另一个,重写它的@Bean方法;
    减小或消除XML配置
    纯Java的方法来配置,与XML配置概念相似
    类型安全和重构友好
    JavaConfig 提供了一种类型安全的方法来配置Spring容器,由于Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。

    SpringBoot、Spring MVC 和Spring有什么区别?

    Spring 包含 Spring MVC ,Spring Boot又包含Spring。

    • Spring:
      Spring一个分层的轻量级开源框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean、维护bean与bean之间的关系。其核心就是控制反转(IOC)、和面向切面(AOP);
    • SpringMVC:
      SpringMVC是一种web层mvc框架,用于替代servlet,springMVC就相当于是Struts2加上Spring的整合。
    • SpringBoot:
      Springboot是一个微服务框架,延续了Spring框架的核心思想IOC和AOP,简化了应用的开发和部署;

    SpringBoot启动时做了什么?

    启动应用 = 通过启动类;
    SpringBoot内置了tomcat,通过启动类启动,配置也集中在application.yml中;

    Spring需要独立的容器运行吗?

    可以不需要,内置了 Tomcat /Jetty 等容器。

    什么YAML?

    • 概念:
      是一种人类可读的数据序列化语言,它通常用于配置文件。
      与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆,可以看出 YAML 具有分层配置数据。

    • 要求:
      写法是key: value(冒号后面有空格),对缩进严格要求,可以存储对象;
      在这里插入图片描述

    YAML配置的优势在哪里?

    相比于传统的properties配置,YAML配置的优势是:

    • 配置有序,在特殊场景下,有序性很重要;
    • 支持数组,数组中的元素可以是基本数据类型、对象;
    • 简洁;

    properties配置文件
    在这里插入图片描述
    yaml配置文件
    在这里插入图片描述

    SpringBoot是否可以使用XML配置?

    可以使用XML配置,需要通过@ImportResource注解引入一个XML配置。
    SpringBoot推荐使用Java配置。

    bootstrap.properties和application.properties有何区别?

    • bootstrap.properties
      由父ApplicationContext加载的, 比application优先加载,配置在应用程序上下文的引导阶段生效。
      里面的属性不能被覆盖.
      一般来说我们在Spring Cloud Config或者Nacos中会用到它。
    • application.properties
      由ApplicationContext加载
      用于Springboot项目的自动化配置

    什么是Spring Profiles?

    • 概念:
      配置文件,用于区分不同的环境,进而对不同环境进行配置。

    • 不同的环境:

    dev = 开发环境,用于开发者调试使用;
    test = 测试环境;
    pre = 灰度环境,比测试环境更真实,指小范围的生产环境,类似游戏的内测;
    prod = 生产环境,正式线上环境;

    • 如何使用
      通过配置文件使用,对application.properties 配置文件的命名规则进行约束,
      通过@profile注释来配置
      在这里插入图片描述

    如何在自定义端口上运行SpringBoot应用程序?

    SpringBoot应用程序默认的监听端口是:8080;
    要想在自定义端口运行,需要在application.properties中进行配置:

    server.port = xxxx
    
    • 1

    如何实现SpringBoot应用程序的安全性?

    使用官方提供的spring-boot-starter-security依赖;

    使用:
    配置类必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。

    比较一下Spring Security和Shiro各自的有缺点?

    • Spring Security
      概念:基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,重量级框架;
      缺点:概念复杂,配置繁琐;不能脱离spring;
      优点:功能强大

    • Shiro
      概念:Java的安全框架,轻量级框架;
      优点:概念简单、配置简单
      缺点:功能简单

    介绍
    两者都是安全框架,主要用于对访问权限进行控制,应用的安全性包括用户认证和用户授权;
    用户认证 = 验证某个用户是否是合法用户;
    用户授权 = 某个用户是否有权限执行某个操作;

    SpringBoot中如何解决跨域问题?

    跨域问题:
    当前页面与被请求页面不是同源的,也就是两者之前协议、域名、端口其中一个不一致。

    解决:
    后端实现跨域的方式是CROS跨域(跨域资源共享 = Cross-origin resource sharing);SpringBoot中有两种形式。

    • 全局配置
      定义配置类,添加@Configuration注解实现WebMvcConfigurer接口,再重写addCorsMappings方法。
      在这里插入图片描述
    • 局部配置
      Controller层在需要跨域的类或者方法上加上@CrossOrigin该注解即可。
      在这里插入图片描述

    介绍
    当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
    举例:

    当前页面被请求页面是否跨域原因
    http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
    http://www.test.com/https😕/www.test.com/index.html协议不相同(http/https)
    http://www.test.com/http://www.baidu.com主域名不同(test/baidu)
    http://www.test.com/http://blog.test.com子域名不同(www/blog)
    http://www.test.com:8080/http://www.test.com:7007/端口号不同

    什么是CSRF攻击?

    概念:
    CSRF,全称Cross-site request forgery,表示跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。

    具体过程:

    • 用户打开浏览器,访问登陆受信任的A网站 ;
    • 在用户信息通过验证后,服务器会返回一个cookie给浏览器,用户登陆网站A成功,可以正常发送请求到网站A ;
    • 用户未退出网站A,在同一浏览器中,打开一个危险网站B;
    • 网站B收到用户请求后,返回一些恶意代码,并发出请求要求访问网站A ;
    • 浏览器收到这些恶意代码以后,在用户不知情的情况下,利用cookie信息,向网站A发送恶意请求,网站A会根据cookie信息以用户的权限去处理该请求,导致来自网站B的恶意代码被执行。

    SpringBoot中的监视器是什么?

    Spring boot actuator是spring启动框架中的重要功能之一。
    可帮助用户访问生产环境中正在运行的应用程序的当前状态。
    有几个指标必须在生产环境中进行检查和监控,即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTPURL访问的REST端点来检查状态。

    如何在SpringBoot中禁用Actuator端点安全性?

    默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR(actuator)角色的用户才能访问它们。

    安全性是使用标准的HttpServletRequest.isUserInRole方法实施的。 我们可以使用management.security.enabled = false 来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

    如何监听所有SpringBoot微服务?

    Spring Boot 提供监视器端点以监控各个微服务的度量。
    这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。
    建立在 SpringBoot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。

    什么WebSockets?

    概念:
    WebSocket是一种计算机通信协议,通过单个TCP连接提供全双工通信信道,是Web应用程序中HTTP通信的替代方法。
    实时应用程序;

    特点:
    WebSocket是双向的,使用 WebSocket 客户端或服务器可以发起消息发送;
    WebSocket是全双工的,客户端和服务器通信是相互独立的;
    单个TCP连接:初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有客户端与服务器的通信;

    什么是Spring Data?

    Spring Data 是 Spring 的一个子项目,用于简化数据库访问,支持关系、非关系数据存储。
    其主要目标是使数据库的访问变得方便快捷。
    Spring Data JPA 致力于减少数据访问层(DAO)的开发量,开发者只需要声明持久层的接口就好。

    SpringData支持关系存储的存储技术:JDBC、JPA;

    什么是Spring Batch?

    Spring Batch 是一个轻量级的、完善的批处理框架;
    提供可重用的函数,对处理日志、事务管理等非常重要;
    通过优化的分区技术,实现高批量和高性能处理作业。

    什么是FreeMarker模板?

    FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。
    Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以设计应用程序代码,前端设计人员设计html代码,最后使用freemarker结合,输出最终页面;

    如何集成SpringBoot和ActiveMQ?

    ActiveMQ = 开源的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

    通过在springboot项目的依赖pom中加依赖即可;
    在这里插入图片描述

    Swagger用来做什么?

    概念:
    Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。
    Swagger 就是将项目中所有接口展现在页面上,并且可以进行接口调用和测试的服务。

    作用:
    将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;
    当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
    通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

    前后端分离,如何维护接口文档?

    采用SpringBoot实现前后端分离, 常见的解决方案是Swagger;
    Swagger = 接口文档生成工具,同时提供接口测试调用的辅助功能;
    使用Swagger可以快速生成一个接口文档网站,接口一发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。

    SpringBoot项目如何热部署?

    概念:
    SpringBoot 框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无须开发人员手动重启项目。
    开发过程中,由于对一段逻辑代码不断地修改测试,在修改之后往往需要重新启动服务,这些服务往往需要加载很久才能启动成功,这种重复操作就降低了程序开发效率。

    具体操作:

    • 添加spring-boot-devtools 热部署依赖启动器
      在这里插入图片描述
    • IDEA软件进行配置部署
      在这里插入图片描述
      file→setting→Build→Compiler 红色框选中,设置为自动编译。

    SpringBoot中的starter到底是什么?

    • starter是pom项目对象模型;
      主要管理一些配置信息,源代码,使用者的信息等。
    • starter是依赖的集合;
      starter可以理解成pom配置了一堆jar组合的空maven项目,用来简化maven依赖配置,starter可以继承也可以依赖于别的starter。
    • starter是提供默认的配置
      starter使用注解自动配置的形式提供默认的配置,使开发项目更便捷。
    • starter是提供版本和框架整合
      starter负责配置固定的版本以及依赖的整合问题。

    Spring-boot-starter-parent到底是什么?

    概念:
    新创建的SpringBoot项目会有这个 Spring-boot-starter-parent 依赖。
    主要功能:
    定义了 Java 编译版本为 1.8;
    使用 UTF-8 格式编码;
    继承自 spring-boot-dependencies,这里面定义了依赖的版本,后期导入依赖不需要版本号;
    执行打包操作的配置;
    自动化的资源过滤;
    自动化的插件配置;
    针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,
    例如application-dev.properties 和 application-dev.yml。

    SpringBoot打成的jar和普通的jar有什么区别?

    SpringBoot默认打的jar包是可执行的jar,可以通过命令java -jar xxx.jar来运行;不能被其他项目依赖,因为它和普通的jar的结构不同;
    普通的jar包,解压后直接就是包名,包里就是代码;SpringBoot打包成的可执行jar解压后,在\BOOT-INF\classes目录下才是书写的代码,因此无法直接引用;如果非要引用,可以在pom.xml文件中增加配置,将SpringBoot项目打包成两个jar,一个可执行,一个可引用。

    如何使用SpringBoot实现异常处理?

    Spring 提供了一种使用 ControllerAdvice 处理异常的方法,通过实现一个 ControllerAdvice 类,来处理控制器类抛出的所有异常。

    如何使用SpringBoot实现分页和排序?

    使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页org.springframework.data.domain.Pageable 传递给存储库方法。

    微服务中如何实现session共享?

    Spring Session + Redis 来实现 session 共享。

    理解:
    在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开,但是经常我们需要在不同微服务之间共享 session。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session,这样就实现了session共享。

    微服务?

    • 概念:
      是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立服务。
      也就是应用必须构建成一系列小服务的组合,可以通过http方式进行通信。
      通信方式:http 或者 rpc

    • 理解:
      将应用的每个功能都独立出来,将独立出来的功能元素进行动态组合;
      微服务的架构是对功能进行复制,而不是对应用进行复制。

    扩展
    单体应用框架(all in one)= 将一个应用中的所有应用服务都封装在一个应用中;
    把数据库访问、web访问等功能放到一个war包里面。
    优点:易于开发和测试;部署方便,只需要将war复制多份即可,放到不同服务器上就可以。

    SpringBoot中如何实现定时任务?

    实现方式:

    • 基于注解(@Scheduled)
      基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机 会受上一个任务执行时间的影响;
    • 基于接口
      用于实现从数据库获取指定时间来动态执行定时任务;
    • 基于注解设定多线程定时任务
  • 相关阅读:
    Springboot教程一使用合理的参数校验拦截判断请求参数是否规范化合理化参数校验
    归并排序,求逆序对
    java计算机毕业设计虚拟物品交易网站源码+系统+数据库+lw文档
    wordpress模板购买网站推荐
    Java之TCP和UDP进行网络编程
    Shell语法详解专栏目录
    国产720亿参数开源免费模型来了!对标Llama2 70B,一手实测在此
    Spring源码篇(十)@Bean怎么注册一个bean
    Linux防火墙
    UE5——源码阅读——3——引擎退出
  • 原文地址:https://blog.csdn.net/LXMXHJ/article/details/126563336