当前位置: 首页 > article >正文

springboot纯干货

1.spring发展
        spring是开源框架,2003年兴起的java轻量级框架。作者:Rod Johnson.
        spring是为了解决企业级应用开发的复杂性而创建的,简化开发
        
        spring1.x时代,都是通过xml配置bean
        spring2.x时代,可使用注解对bean进行声明和注入
        spring3.x时代,开始提供了java配置方式,使用此方式可以更好地理解配置的bean
        spring4.x时代和springboot都推荐使用java配置方式
    2.springboot和微服务介绍
        springboot简介
            由Pivotal团队提供的全新框架,目的是为了简化新spring应用的初始搭建以及开发过程.
            此框架使用了特定的方式来进行配置,不再需要定义样板化的配置.
            官方地址:https://spring.io/projects/spring-boot
            官方文档地址:https://docs.spring.io/spring-boot/docs/current/reference/html/
        springboot优点
            约定优于配置
            创建独立的springboot应用程序;嵌入的tomcat jetty或undertow,无需部署war文件
            允许通过maven来根据需要获取starter
            尽可能的使用自动配置spring
            提供生产就绪功能,如指标,健康检查和外部部署 properties yaml yml
            完全没有代码生成,对XML没有要求配置
            
            特性理解
                为基于spring的开发提供更快的入门体验
                开箱即用,没有代码生成,无需XML配置.也可修改默认值来满足特定的需求
                提供一些大型项目中常见的非功能特性:嵌入式服务器,安全,指标,健康检测,外部配置等
                springboot并不是对spring功能的增强,而是提供了一种快速使用spring的方式
            传统开发模式:所有功能打包在一个war包中,除了容器外基本没有外部依赖,部署在一个JEE容器(tomcat,jboss,weblogic)中,包含了do/dao/service/ui等所有逻辑
                优点:开发简单,集中式管理,基本不会重复开发,功能都在本地,没有分布式的管理和调用消耗
                缺点:效率低(开发都在同一个本地代码,相互等待,冲突不断);
                    维护难(代码功能耦合在一块,新人不知从何下手);
                    不灵活(构建时间长,任何小改动都要重构整个项目);
                    稳定性差(一个微笑的问题,都可能导致整个应用挂掉);
                    扩展性不够(无码满足高并发下的业务需求);
                    对服务器的性能要求要统一,更高
            
            微服务开发
                微服务:架构风格(服务微化)
                微服务是指开发一个单个小型但有业务功能的服务,每个服务有自己的处理和通信机制,可部署在单个或多个服务器上
                微服务也指一种松耦合的,有一定有界上下文的面向服务的架构
                目的:有效拆分应用,实现敏捷开发和部署
                
                优点:
                    每个微服务都很小,可聚焦一个指定的业务或功能需求
                    适合2-5人小团队开发
                    松耦合,是有功能,有意义的服务,开发阶段和部署阶段都是独立的
                    可使用不同的语言开发
                    可部署在中低端配置的服务器上
                    很容易和第三方集成
                    每个服务都有自己的存储能力,单独的库,也可有统一的库
                缺点:
                    可能会带来过多的操作
                    可能1件事需要做两遍
                    分布式系统可能复杂难管理
                    分布跟踪部署难
                    服务数量增加时,管理难度增加

    3.springboot入门程序
        查看参考资料即可.
        自定义banner制作网址:https://www.bootschool.net/ascii
        自定义banner在 src/main/resourcees目录下创建一个banner.txt文件,输入想显示的内容即可
    4.常用注解[spring的java配置]
        4.1 回顾spring和java的注释
            4.1.1 类上的注解
                @Controller 控制器
                @RestController = @Controller + @ResponseBody 返回json的控制器
                @Service 标记服务接口
                @Respority 标记仓库接口
                @Component 标记组件
                @RequestMapping 请求映射(可用在方法上),作用在类上的常用注解
            4.1.2 方法上的注解
                @RequestMapping 请求映射 
                @GetMapping GET请求
                @PostMapping POST请求
                @DeleteMapping DELETE请求
                @PutMapping PUT请求
                @PatchMapping PATCH请求
                @ResponseBody 返回JSON对象
            4.1.3 参数上的注解
                @RequestBody 入参是JSON对象
                @PathVariable 将路径上的参数映射到入参里面
                @RequestParam 将请求参数绑定在控制器的请求参数上
            4.1.4 属性上的注解
                @Autowired 自动注入(首选按照类型) byType byName
                @Resource  自动注入(首选按照名字) byName byType 
        4.2 相关注解说明
            4.2.1 @Configuration 作用于类上,相当于一个xml配置文件,例如application-dao.xml
            4.2.2 @Bean 作用于方法上,相当于xml配置中的<bean>标签
                例如:某配置类上使用注解@Configuration,方法上使用@Bean(value="user1")注解修饰
            4.2.3 @Qualifier注解 此注解可以表明那个实现类才是需要的。@Qualifier的参数名称必须是之前定义@Bean注解的名称之一
            4.2.4 @Primaty 主候选的。当IOC容器中有多个相同类型的对象时,出现冲突时,使用该注解修饰的对象作为主候选对象
            4.2.5 @Import 创建配置文件之后可以引入其他配置文件 
            4.2.6 @ComponentScan("com.ss.*.mapper") 配置扫描,代替配置文件中<context:component-scan base-package="com.ss.*.mapper"/>的作用
    5.springboot热部署
        5.1 热部署是什么
            spring提供了spring-boot-devtools的模块来使springboot应用支持热部署,提高开发效率,修改代码后无需重启应用。
        5.2 添加依赖 org.springframework.boot spring-boot-devtools runtime true 
        5.3 配置idea的启动面板 不配置面板,可直接使用ctrl+F9刷新,配置以后,当修改代码,光标失去idea的焦点后,就会触发自动部署
    6.手动创建springboot项目 查看参考资料即可
    7.springboot自动配置原理以及启动分析(难点)
        1.默认的包扫描:启动类所在的包及其子包
        2.依赖的分析
            7.1 pom.xml的依赖分析
                自定义项目继承了springboot的父项目,spring-boot-starter-parent,点进spring-boot-starter-parent中可看到很多依赖的版本。
                sprint-boot-dependencies是真正管理springboot应用中所有依赖版本的地方,springboot的版本控制中心;
                往后导入依赖默认不需要写版本,但是如果导入的包不在依赖中管理就需要手动配置版本了。
            7.2 启动器 spring-boot-starter
                sprint-boot-starter-xxx  就是spring-boot的启动器
                例如 引入spring-boot-starter-web之后,springboot就自动导入了web模块运行的所有组件
                springboot将所有功能场景抽取出来,做成一个个starter,需要使用那个功能,引入对应的starter即可,所有相关的依赖都会导入进来。也可自定义starter。
            7.3 原理分析
                7.3.1 注解功能划分 
                @SpringBootApplication 标记被修饰的类是一个springboot的应用
                    @SpringBootConfiguration  标记为一个springboot的配置类(springboot提供的)
                        @Configuration 标记为spring的配置类(spring提供的)
                            @Component 标记spring的一个组件
                    
                    @EnableAutoConfiguration  开启自动配置
                        @AutoConfigurationPackage 自动配置包
                            @Import(AutoConfigurationPackages.Registrar.class) 导入注册器(包注册)
                        @Import(AutoConfigurationImportSelector.class) 导入了选择器
                7.3.2 如何自动扫描(默认扫描启动类所在的包及其子包)
                    @Import(AutoConfigurationPackages.Registrar.class),在Registrar中,register()方法
                7.3.3 如何加载自动配置类 
                    先找到@Import(AutoConfigurationImportSelector.class)
                    在类中找到    getAutoConfigurationEntry()方法 
                    进入 getCandidateConfigurations()方法,spring的加载工厂去筛选所有引入(link)EnableAutoConfiguration的配置类,EnableAutoConfiguration是key,返回的list是value
                    接着进入 loadFactoryNames()方法
                    查看 MATE-INF/spring.factories文件,从候选方法中获取到了需要自动配置的全限定类名的集合,再回到一开始的加载候选的方法
                    最后回到 getAutoConfigurationEntry()方法向下执行
                    踢出掉不需要的自动配置类(pom.xml中没有加入依赖的)
            7.4 如何加载前端控制器(DispatcherServlet)
                7.4.1 ssm中,需手动创建 DispatcherServlet,然后注入到Servlet容器中
                7.4.2 在springboot中,只需要引入web的starter,就默认做好了
                    7.4.2.1 查看 DispatcherServletAutoConfiguration 自动配置类
                        @AutoConfigureOrder(Ordered.HIGHEST_PREREDENCE) 配置加载的顺序
                        @ConditionalOnWebApplication(type=Type.Servlet) 当前配置类需要web环境,如果没有web环境则不装配
                        @ConditionalOnClass(DispatcherServlet.class) 当前配置类需要DispatcherServlet类
                        @AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)当前配置类在web服务配置后加载
                        在DispatcherServletConfiguration方法中使用@Bean(name="dispatchetServlet") 创建DispatcherServlet对象注入到IOC容器中
    8.springboot的run方法做了什么
        初始化SpringBootApplication实例对象
        判断当前应用是否为web应用
        查找并加载可用的初始化类,设置在initializers属性中
        找到所有应用的监听器,设置在listener中
        推断并且设置main方法的定义类,找到运行的主类
    9.springboot提供了那些自动配置类
        查看地址:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
        需要使用,引入对应的starter即可,只需自定义一些参数,因为已有默认配置。如果需要的组件没有starter,则需自行编写
    10.springboot配置文件语法[重中之重]
        10.1 首先引入依赖 spring-boot-configuration-processor 
        10.2 创建Hero类,使用@ConfigurationProperties(prefix="hero") 此注解表示使用hero前缀去ioc容器中读取配置文件,使用@Component注解标记为spring的一个组件,@Data自动生成get、set
            属性有 id、age、name、Date birth、String [] bobby、list、set、map
        10.3 properties方式
            hero.id=1、hero.age=10、hero.name=zs、hero.birth=2010/12/19、hero.bobby=C,P,J、hero.list=C,P,J、hero.set=f,b,s、hero.map.k1=v1 hero.map.ke=v2
        10.4 yml方式 查看参考资料。如果properties和yml方式都存在,properties优先级更高
        10.5 测试 使用 @Autowired 注解修饰注入Hero 
        10.6 配置文件占位符:yml文件中 可使用 ${random.int}占位符生成随机值
        10.7 配置文件读取IOC容器中的值 yml文件中可使用${hero.age}作为name属性的value
        10.8 propertie和yml两种文件说明
            properties有配置则从properties中获取,没有配置则从Yml文件中获取。
            两种文件是互补的存在
            
    11.@Value读取配置文件
        11.1 自定义类后,在属性上使用@Value("${hero.id}") private Integer id; ${hero.id} 对应的值是yml文件中的数据 
        11.2 @Value只能注入普通的属性(基本数据类型String,Date),其它的复杂类型是不能取到值的(如果yaml配置是array:c,j。是可以获取到值的);如果属性使用的是驼峰命名法,不能
            使用属性名注入,要使用@Value("${her.class-name}")来取值,不可使用@Value("${hero.className}")
        11.3 @Value和@ConfigurationProperties比较
            功能:@ConfigurationProperties批量注入文件的属性 、 @Value一个个绑定 
            松散绑定:@ConfigurationProperties支持 、 @Value不支持
            SpEL:@ConfigurationProperties不支持 、 @Value支持
            JSR303数据校验:@ConfigurationProperties支持 、 @Value不支持
            复杂类型封装:@ConfigurationProperties支持 、 @Value不支持
            
            扩展:SpEL是一种表达式语言,用于在spring框架中动态操作数据;JSP303是java的bean validation的规范,用于验证java bean的属性。
    12.注解验证
        12.1 引入依赖 springboot2.3.x之后,需单独引入spring-boot-starter-validation依赖,之前web模块中已包含
        12.2 在需要验证的类上添加注解@Validated,在需要验证的属性上添加注解修饰,例如@Email(message="邮箱不合法"),使用一个错误的邮箱,测试查看对应属性即可看到"邮箱不合法"的输出
        12.3 常用的验证注解:
            @NotNull 不可为null,可空着不写(可为空)
            @NotEmpty 不可为null,不可为空,可为空格""
            @NotBlank 不可为null,不可为空,不可为空格""
            @Min 最小值
            @Max 最大值
            @Size(min=1,max=6) 长度限制
            @Range(min=1,max=2) 范围限制
            @Pattern(regexp"[0,1]{1}") 正则限制 
    13.@PropertySource和@ImportResource的使用
        13.1 为何使用@PropertySource
            使用@ConfigurationProperties和@Value的注入方式,配置文件都是在application.properties或application.yml文件中。
            使用@PropertySource可将配置文件不写在 application.properties和application.yml中 
        13.2 注入优先级问题:所有的配置都是优先注入application.properties或application.yml中的数据。如果要使优先级不一样,则需要修改配置文件的前缀
        13.3 @PropertySource注解的使用
            @PropertySource(value={"classPath:hero.properties"}) //properties配置文件的指定
            @ConfigurationProperties(prefix="hero") //使用hero前缀去ioc容器中读取配置文件
        13.4 创建hero.propertie配置文件,并配置对应属性值
        13.5 使用@Autowired注入Hero对象,使用@Test修饰的方法输出hero.测试类上使用@SpringBootTest注解修饰 
        
        13.6 为何使用@ImportResource 
            使用@PropertySource注解可不使用spring以前的xml配置文件的方式,如果还想使用spring的xml的配置方式,使用@ImportResource
        13.7 创建实体类Hero4
        13.8 创建beans.xml,将hero4注入为bean 
        13.9 启动类添加注解@ImportResource(locations={"classpath:beans.xml"})
        13.10 测试类中使用@Autowired注解注入Hero4,输出查看即可 
    14.Profile配置文件详解
        14.1 为何要使用profiles
            开发中,一般有开发环境和生产环境,两套环境。有时开发环境和生产环境的配置不一样,想要快速切换,便需要使用profiles文件
        14.2 创建 application-dev.xml,application-pro.xml,
        14.3 修改application.xml 中spring.profiles.active对应的值为dev或pro,激活那个配置文件,就会使用那个配置文件进行运行
        14.4 打jar包部署运行测试 命令:java -jar 01-spring-boot-hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
    15.配置文件加载优先级和外部配置文件
        15.1 项目内部配置文件
            springboot启动会自动扫描application.properties或application.yml作为springboot的默认配置文件,同一目标下的properties文件的优先级高于yml文件 
            15.1.1 配置文件可以放的位置及其优先级排序从高到底,具体图片效果可查看参考资料 15.1.1 
                file:./config/
                file:./
                classpath:/config/
                classpath:/
            15.1.2 查看ConfigDataEnvironment
            15.1.3 测试时,需要修改pom文件的编译路径,确保所有的配置文件都编译后测试
        
        15.2 外部的配置文件 
            在服务器某磁盘位置保存一个application.yml或application.properties文件,指定端口为8009,打包后通过以下命令运行
            java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.yml
            
            不使用本地的配置文件,也可使用命令行参数指定(例如指定端口和上下文路径)
            java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8888 --server.servlet.context-path=/activity
    16.自动配置原理以及@Conditional派生注解
        16.1 自动配置
            springboot在启动时,
            去扫描加载了所有引入依赖的jar包下面的MATE-INF/spring.factories文件,
            然后通过EnableAutoConfiguration为key,所有自动配置类的全限定名为value(list)
            经过筛选排除掉pom中没有添加依赖的配置类
            最后将list中符合条件的自动配置类的全限定类名添加到IOC容器中进行管理,从而实现了自动配置原理
        16.2 以HttpEncodingAutoConfiguration为例来理解自动装配 具体内容查看参考资料16.3
        16.3 总结 
            springboot启动会加载大量的配置类;
            需要的功能,springboot有无默认写好的配置类;
            配置类中有的组件,无需再配置
            给容器中自动配置类添加组件时,会从properties类中获取某些属性,便可在配置文件中指定这些属性的值
                xxxxAutoConfiguration 自动配置类,给容器中添加组件 
                xxxxProperties 封装配置文件中的默认配置 
        16.4 @Conditional 派生注解 
            必须是@Conditional指定的条件成立,才给容器中添加组件,配置类中的内容才会生效。(条件之间是并且的关系)
            @Conditional扩展注解
                @ConditionalOnBean 容器中存在指定Bean
                @ConditionalOnMissingBean 容器中不存在指定Bean
                @ConditionalOnClass 容器中存在指定类
                @ConditionalOnMissionClass 容器中不存在指定类 
                @ConditionalOnWebApplication 当前是web环境
                @ConditionalOnNotWebApplication 当前不是web环境 
        16.5 配置文件中配置debug=true,让控制台打印自定配置报告,便可得知那些自动配置类生效        
    17.整合logback
        17.1 概述
            系统运行,日志不可或缺。可调试程序、记录运行状态、排查问题。
            springboot内部集成了LogBack日志依赖,默认使用Logback记录日志信息,默认根据base.xml配置内容来输出到控制台和文件中,但是默认配置达不到企业级项目的要求。
        17.2 创建 logback-spring.xml,完整内容可查看参考资料 17.3 
            日志级别从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL 如果设置为WARN,则低于WARN的信息都不会输出
            scan:此属性设置为TRUE时,配置文件发生改变,将会被重新加载,默认值为true 
            scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给定时间单位,默认单位是毫秒。当scan为true时,此属性生效,默认时间为1分钟
            debug:此属性设置为true,将打印logback内部日志信息,实时查看Logback内部运行状态,默认为false 
        17.3 修改启动类测试,启动类上使用@Slf4j注解修饰,即可在main方法中使用log.error、warn、info、debug、trace方法输出内容     
            启动输出之后,即可在本地对应路径看到生成的.log文件 
    18.AOP开发
        18.1 概述 
            aop是spring的两大功能模块之一,为解耦提供了有些的方案。
            springboot集成aop拦截业务组件很方便
            AOP作用:不修改源代码前提下,对类中的方法进行增强(前置、后置、环绕、异常)
        18.2 创建项目并添加maven依赖 org.springframework.boot spring-boot-starter-aop 
        18.3 创建任意测试类Man,将此类添加至IOC容器管理(AOP作用的类必须添加至IOC容器),
        18.4 根据任意测试类创建此类的切面类,也将切面类添加至IOC容器管理,使用@Aspect注解修饰;
            类中指定切入点,编写4个增强方法,前置、后置、环绕、异常对应方法上分别使用@Before、@After、@Around、@AfterThrowing注解修饰
        18.5 测试类中注入测试类,调用方法既可看到对应的增强AOP效果
        18.6 代理方式的切换
            springboot2.x之后,代理方式的切换需要在配置文件中配置,使用注解切换方式失效
            修改application.yml文件的切换代理方式:
                spring:aop:proxy-target-class:true ## false表示使用JDK代理,true表示使用CGLIB代理
            springboot2.x之后,代理方式默认使用CGLIB    
    19.WEB静态资源访问规则
        19.1 springboot访问静态资源的方式
            查看WebMveAutoConfiguration中的静态类WebMvcAutoConfigurationAdapter
            关于资源管理的方法addResourceHandlers
            方法中可看到静态资源的4个存放位置,
            如果4个位置都有相同的文件,访问优先级顺序为:META-INF/resources>resources>static>public 
        19.2 自定义静态资源访问方式
            19.2.1 自定义方式1-yml配置文件方式 
                sprinb:
                    web:
                        resources:
                            static-locations: classpath:/mystatic/  ##静态资源存放的路径
                    mvc:
                        static-path-pattern: /static/**               ## 访问MVC的路径映射
            19.2.2 java方式
                自定义配置类(使用@Configuration修饰)实现WebMvc的配置WebMvcConfiger,并重写静态资源配置的方法 addResourceHandlers 
        19.3 webjars的访问规则 
            19.3.1 webjars是什么
                webjars是打包到JAR(java archive)文件中的客户端web库(例如jquery和bootstrap)
                在基于JVM的web应用程序中管理客户端依赖项
                使用JVM的构建工具(如maven、gradle、sbt)来下载客户端依赖项
                了解正在使用的客户端依赖项
                传递依赖关系可自动解析,并可通过requirejs来加载
                官网:https://www.webjars.org/
            19.3.2 引入依赖 org.webjar.jquery 3.6.0 
            19.3.3 启动方位 http://localhost:8080/webjars/jquery/3.6.0/jquery.js 
    20.Thymeleaf模板的使用[了解]
        20.1 Thymeleaf概述
            Thymeleaf是与Velocity、FreeMarker 类似的存储引擎。可完全替代JSP。相较其他模板引擎,有以下三特点:
                1.有无网络皆可运行。可在浏览器查看静态效果,也可在服务器查看带数据的动态页面效果。原因是它支持html原型,然后在html标签中增加额外的属性来达到模板+数据的展示方式。
                    浏览器解释HTML时会忽略未定义的标签属性,所以thymeleaf可以静态的运行;当有数据返回时,thymeleaf会动态地替换掉静态内容,使页面动态显示。
                2.Thymeleaf开箱即用的特性。提供标准和spring标准两种方言,可直接套用模板实现JSRL,OGNL等表达式效果,避免每天改模板,改list,改标签的困扰。同时开发人员可扩展和创建自定义的方言。

                3.Thymeleaf提供spring标准方言和一个与springmvc完美集成的可选模块,可快速实现表单绑定,属性编辑器,国际化等功能
                
        20.2 创建项目并添加thymeleaf的依赖 
        20.3 Spring Boot项目Thymeleaf模板页面存放位置
            查看Thymeleaf自动配置类 ThymeleafAutoConfiguration,自动配置类中有ThymeleafProperties类(关联配置文件类)。也可在yml文件中通过spring.thymeleaf.prefix修改页面存放位置
        20.4 通过Controller跳转到Thymelaef界面 
            20.4.1 在指定位置下创建hello.html 
            20.4.2 创建HelloController,使用@Controller修饰,类中写方法 @GetMapping("hello")public String hello(){return "hello";}
            20.4.3 调用 http://localhost:8080/hello 测试访问即可 
        20.5 Themeleaf的相关语法 
            官网地址:https://www.thymeleaf.org/ 常用表达式可查看参考资料20.5 
        20.6 Thymeleaf读取model中的对象     
            20.6.1 创建实体类Hero类
            20.6.2 在RouteController方法中,增加一个方法跳转"showHERO"
            20.6.3 创建showHERO界面
            20.6.4 测试访问: hhttp://localhost:8080/showHERO 
        20.7  Thymelfaf读取    Model中某个集合
            20.7.1 在RouteController中增加一个方法跳转,返回值为 return "showHeroList";
            20.7.2 创建showHeroList界面
            20.7.3 测试访问 http://localhost:8080/showHeroList
        20.8 ThymeLeafObjects的使用
            20.8.1 在RouteController中增加一个方法跳转,返回值为 return "showObj"
            20.8.2 创建showObj界面 
            20.8.3 测试访问 http://localhost:8080/thymeleafObject/showObj
        20.9 ThymeLeaf在js中取值
            例如:let name = "[[${name}]]"
        20.10 ThymeLeaf链接传值 
            20.10.1 创建一个按钮,点击传值
            20.10.2 在RouteController中增加一个方法,返回值为return "ok",方法使用@ResponseBody注解修饰 
            
     21.springboot自动管理MVC的分析
        21.1 查看WebMvcAutoConfiguration及其内部静态类  MVC做了那些事情?
            请求分发-dispatcherservlet
            适配器-requestmappinghandlerAdapter
            消息转换-messageconverter
            视图解析-contentnegotiatingviewresolver
            格式化-addformatters
        21.2 具体查看视图解析
            在 contentnegotiatingviewresolver 内容视图协商解析器中初始化servletContext时,把加载的所有视图解析器收集了起来(只要IOC容器中实现了viewresolver接口的,都可被收集起来)
        21.3 具体查看文件上传下载
            MultipartAutoConfiguration已自动配置
            MultipartProperties配置文件中可设定参数,可在yml文件中配置 
        21.4 具体查看格式化(接收页面参数并转化)
            在WebMvcAutoConfiguration的addFormatters方法中,默认配置了很多转换规则,也可在配置文件中自行设置,例如 spring:mvc:formar:date-time:yyyy-MM-dd HH:mm:ss
            format.date 对应java.utils.date
            format.date-time 对应java.time.LoaclDateTime 
        21.5 欢迎页面自动配置
            在WebMvcAutoConfiguration中的WelcomePageHandlerMapping方法下的getWelcomePage方法中的getIndexHtml中,指定了index.html        
    22.扩展MVC的组件[了解]
        自定义类实现WebMvcConfigurer重写之前的方法即可实现自定义拓展
        22.1 自定义视图解析器[熟悉],可省略controller
            实现方式:重写addViewControllers方法
        22.2 自定义拦截器[掌握]
            22.2.1 创建自己的拦截器
                自定义类实现 HandlerInterceptor 接口,重写preHandle(返回true即放行,否则拦截)、postHandle、aftersCompletion方法
            22.2.2 注册到webmvc管理 
                自定义类重新 addInterceptors方法,通过 InterceptorRegistry的addInterceptor方法将自定义的拦截器注册进来,并可通过addPathPatterns和excludePathPatterns设置拦截路径和放行路径
    23.注册Web三大组件[重点]
        Servlet     @WebServlet      web.xml
        Filter         @WebFilter       web.xml
        Listener     @WebListener     web.xml
        23.1 注册自己的Servlet
            可模仿DispatcherServlet的注册方式
            23.1.1 创建自定义Servlet,UserServlet继承HttpServlet,重写doGet和doPost方法,类上使用@Component进行修饰
            23.1.2 配置类中注册自己的Servlet,配置类使用@Configuration注解修饰,类中创建自定义方法,使用@Bean修饰,方法中使用ServletRegistrationBean的setServlet方法将UserServlet注册
            
        23.2 注册自己的Filter 
            23.2.1 创建自定义Filter,MyFilter实现Filter接口,重写doFilter方法,类使用@Component注解修饰 
            23.2.2 配置类中注册自己的Filter,类中创建自定义方法,使用@Bean修饰,方法中使用FilterRegistrationBean的setFilter方法将MyFilter注册
        23.3 注册自己的Listener 
            23.3.1 创建自定义Listener,实现ServletContextListener接口,重写contextInitialized和contextDestoryed方法
            23.3.2 配置类中注册自己的Listener,类中自定义方法,使用@Bean修饰,方法中使用 ServletListenerRegistrationBean的setListener方法将MyListener注册
        
    24.数据源配置和自动管理[重中之重]
        24.1 创建项目选择依赖
            Lombok、Spring Web、JDBC API、 MySql Driver
        24.2 创建数据库和对应的表
        24.3 使用DriverManagerDataSource 
            24.3.1 修改配置文件
                spring:
                datasource:
                driver-class-name:com.mysql.cj.jdbc.Driver
                type:org.springframework.jdbc.datasource.DriverManagerDataSource #spring自带数据源
                url:jdbc://localhost:3306/test?serverTimeZone=GMT%2B8
                username:root
                password:root
            24.3.2 测试
                自定义测试类,类使用@SpringBootTest修饰,使用@AutoWired注入DataSource,自定义方法使用@Test修饰,输出dataSource结果为DriverManagerDataSource即成功
        24.4 使用Druid数据源[自己配置]
            24.4.1 添加Druid依赖 com.alibaba.druid 
            24.4.2 添加MyDruidProperties配置类,类上使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ConfigurationProperties(prefix="my.druid")修饰,
            包含初始化链接数-initialSize、最大链接活跃数-maxActive、最小链接数-minIdle、检查的sql语句-validationQuery、
            监控配置-StatView(监控登录用户名-loginUsername、监控登录密码-loginPassword、白名单-allow、黑名单-deny、映射路径-String[] urlMapping)等属性
            24.4.3 添加 MyDruidAutoConfiguration 自动配置类,
                类上使用@Configuration、@EnableConfigurationProperties(MyDruidProperties.class) //指定配置类、@ConditionalOnClass(DataSource.class)//必须有DataSource类才生效 修饰
                类中使用@Autowired注入@MyDruidProperties
                类中编写创建数据源的方法,方法名自定义,方法返回值为DruidDataSource,方法使用@Bean修饰
                类中编写将MyDruidProperties注册Servlet的方法,方法返回值为ServletRegistrationBean<StatViewServlet>
            24.4.4 修改yml配置文件
                my:
                    druid:
                        url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
                        username: root
                        password: root 
                        driver-class-name: com.mysql.cj.jdbc.Driver
                        initial-size:2
                        max-active:10
                        min-idle: 3
                        validation-query: select 'x'
                        state-view:
                            login-username: admin
                            login-password: admin 
                            allow:
                            deny:
                            url-mapping:
                                - /druid/*
            24.4.5 测试访问 http://localhost:8080/druid 
        24.5 使用Druid数据源[官方starter]
            pom.xml中添加com.alibaba.druid-spring-boot-starter依赖 1.2.6版本 
            24.5.1 修改配置文件
                spring:
                    datasource:
                        driver-class-name: com.mysql.cj.jdbc.driver 
                        url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimeZone=GMT%2B8
                        username: root 
                        password: root
                        type: com.alibaba.druid.pool.DruidDataSource
                        druid:
                            max-active: 10
                            min-idle: 2
                            validation-query: select 'x'
                            stat-view-servlet:
                                login-username: admin 
                                enabled: true #启动监控页
                                login-password: admin 
                                allow:
                                deny:
                                url-pattern: /druid/*
    25.集成mybatis[重点] 
        25.1 创建数据库并新增测试数据
        25.2 创建新模块并添加依赖 org.mybatis.spring.boot.mybatis-spring-boot-starter、mysql-connector-java、druid-spring-boot-starter、lombok、spring-boot-starter-test、
                                    spring-boot-starter-web
        25.3 根据数据库创建对象(逆向工程)
        25.4 修改yml配置文件 
            在24.5.1 配置文件基础上进行修改,添加以下文件 
                mybatis:
                    mapper-locations: classpath:mapper/*.xml #mapper.xml文件所在位置
                configuration:
                    log-impl: org.apache.itatis.logging.stdout.StdOutImpl #sql日志输出 
        25.5 修改启动类 
            添加注解 @MapperScan(basePackages={"com.ss.mapper"})
        25.6 查询测试 
            创建测试类,使用@SpringBootTest修饰类,使用@Autowired注入UserMapper;测试方法使用@Test修饰,方法中使用UserMapper的查询方法,验证查询结果即可
        25.7 使用注解方式 
            mapper接口的方法上使用注解的方式
            @Select("select * from user")
            List<User> selectAllUser();
        25.8 配置PageHelper插件分页(第一种方式,不推荐使用)
            25.8.1 添加 pagehelper 依赖  com.github.pagehelper pagehelper 
            25.8.2 创建mybatis-cfg.xml 
                <configuration>
                    <settings>
                        <setting name="logImpl" value="STDOUT_LOGGING"/>
                    </settings>
                    
                    <plugins>
                        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
                    </plugins>
                </configuration>
            25.8.3 修改application.yml文件
                mybatis:
                    mapper-locations: classpath:mapper/*.xml  #mapper.xml文件路径
                    config-location: classpath:mybatis-cfg.xml #指定配置文件 
            25.8.4 测试分页
                方法中第一行先写 Page<User> page = PageHelper.startPage(1,2);最后再调用usermapper查询所有用户的方法,输出结果即可验证
        25.9 配置PageHelper插件分页(第二种方式,推荐使用)
            25.9.1 依赖pagehelper的starter
                groupId:com.github.pagehelper 
                artifactId: pagehelper-spring-boot-starter 
            25.9.2 删除Mybatis-cfg.xml后修改application.xml文件
                mybatis:
                    configuration:
                        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #sql日志输出
                    mapper-locations: classpath:mapper/*.xml #mapper.xml文件位置
                    ## config-location: classpath:mybatis-cfg.xml #此配置移除 
            25.9.3 测试查询分页
                方法中第一行先写 Page<User> page = PageHelper.startPage(1,2);最后再调用usermapper查询所有用户的方法,输出结果即可验证
        25.10 事务管理 
            和spring一样,但是springboot只需要再serviceImpl类或方法添加@Transactional注解即可
    26.使用外部tomcat[了解]
        springboot内置的tomcat不支持jsp,使用的模板引擎是[thymeleaf]
        26.1 创建项目,选择打包方式为war
        26.2 选择依赖
            spring web 、 lombok
        26.3 配置pom.xml,添加以下依赖
            groupId:org.springframework.boot
            artifactId:spring-boot-starter-tomcat 
            
            ##加入内嵌tomcat对jsp的支持
            groupId:org.apache.tomcat.embed
            artifactId:tomcat-embed-jasper
            
            ##servlet依赖
            groupId:javax.servlet
            artifactId:javax.servlet-api

            ##jstl依赖
            groupId:javax.servlet
            artifactId:jstl
            groupId:taglibs
            artifactId:standard
        26.4 添加idea配置 具体操作可查看参考资料26.4图片
        26.5 配置外部tomcat 具体操作可查看参考资料26.5图片
        26.6 新建controller,定义方法返回结果为 return "test",方法的请求路径为test
        26.7 创建test.jsp界面 
        26.8 修改配置文件
            spring:
                mvc:
                    view:
                        prefix: /WEB-INF/view/
                        suffix: .jsp 
        26.9 启动访问 http://localhost:8080/test                     
    27.集成swagger[熟悉]    
        27.1 问题描述 
            随着技术的发展,现在网站架构基本都变成前端渲染、前后端分离的形态。
            而且前后端在各自的道路上越走越远,前后端的唯一联系变成了API接口;
            API文档称为了前后端开发人员联系的纽带。
            swagger是一款更好书写API文档的框架,而且swagger可完全模拟http请求,入参和实际情况差别几乎为零。
        27.2 使用步骤
            27.2.1 创建项目并加入依赖
                groupId:io.springfox
                artifactId:springfox-boot-starter
            27.2.2 创建SwaggerProperties信息配置类 
                使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ConfigurationProperties(prefix="swagger3")注解修饰配置类
                配置类包含以下属性:
                    basePackage-扫描的包,给这个包下面创建文档
                    name-作者姓名
                    url-作者主页链接
                    email-作者邮箱
                    version-版本号
                    groupName-分组名称
                    title-文档标题
                    description-文档描述
                    termsOfServiceUrl-组织地址
                    license-许可证
                    licenseUrl-许可证链接
            27.2.3 创建SwaggerAutoConfiguration自动配置类
                类注解使用@Configuration、@EnablaOpenApi(开启swagger的功能,旧版本是EnableSwagger2)、@EnableConfigurationProperties(SwaggerProperties.class)修饰
                类中使用@Autowired注入SwaggerProperties
                类中定义docket方法,返回值为Docket,方法使用@Bean注解修饰。修饰符为public
                类中定义getApiInfo方法,返回值为ApiInfo,修饰为private,用于在docket方法中使用
            27.2.4 修改yml配置文件
                swagger3:
                    base-package: com.ss.controller
                    name: ss
                    url: https://gitee.com/ss
                    email: xxx@xx.com
                    version: 1.0
                    group-name: ss
                    title: "测试"
                    description: "测试swagger文档"
                    terms-of-service-url: https://gitee.com/ss
                    license: ss
                    license-url:https://gitee.com/ss
                spring:
                    jackson:
                        date-format:yyyy-MM-dd HH:mm:ss
                        time-zone:GMT+8
                    mvc:
                        format:
                            date-time:yyyy-MM-dd HH:mm:ss 
            27.2.5 创建hero类
                类上使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ApiModel("英雄对象") #描述实体类
                类中的属性使用@ApiModelProperty(value="属性描述")
            27.2.6 创建Controller
                类上使用注解@Api(tags="接口描述")
                类中的方法上使用@Apioperation("方法作用描述")
                类中的方法如果有基本数据类型的参数,可使用@ApiImplicitParam(name="参数名",value="参数含义",required=true,paramType="path/query",dataType="数据类型")
            27.2.7 测试访问文档页面
                http://localhost:8080/swagger-ui/index.html 
            27.2.8 swagger界面进行接口测试 具体操作可查看参考资料 27.2.8 
            27.2.9 补充注解说明
                @Api 属性有value和description,用于修饰类
                @ApiProperties 属性有value和notes,用于修饰方法,参数的描述容器
                @ApiImplicitParams 属性为@ApiImplcatParam数组,用于修饰方法,参数的描述容器
                @ApiImplicitParam 
                    name 与参数名对应、value-参数中文描述、required-是否必填(true/false)、dataType-参数类型、
                    paramType-参数请求方式(query/path,query对应Parameter ?传递;path对应PathVariable path传递)
                    defaultValue 默认值
    28.spring boot异步
        java中异步就是多线程
        springboot中的异步是种快速使用多线程的方式
        28.1 概述
            28.1.1 什么是异步调用
                异步调用是相较于同步调用而言,同步调用是指按照程序预定顺序一步步执行,每一步必须等上一步执行完之后才可执行。异步调用则无需等待上一步执行完便可执行。
            28.1.2 如何实现异步调用
                多线程是一种实现异步调用的方式。
                非springboot项目中实现异步调用使用的就是继承thread类或实现runnable接口,或jdk1.5以上提供的executors线程池。
                springboot项目则提供了很方便的方式执行异步调用
        28.2 实践
            28.2.1 创建项目并选择依赖 lombok、spring web 
            28.2.2 创建异步任务类AysncTask,类使用@Component注解修饰,编写3个方法,使用@Async修饰。3个方法分别休眠1、2、3秒。
            28.2.3 创建自定义controller,使用@Autowired注入AsyncTask,方法中分别调用AsyncTask的3个方法。最终3个方法共计耗时3秒即异步执行
    29.springboot定时任务
        例如需求:每天晚上11点将前一天的报表数据进行统计。
        实现方案:
            写一个每天晚上11的定时任务,此任务从数据库中统计数据
        29.1 概述
            springboot定时任务是与quartz整合,无需添加任何依赖
            在springboot项目启动类上添加注解@EnableScheduling开启定时调度
            在需要定时调度的方法上添加@Scheduled注解,其中可指定cron表达式和其他的定时方式
        29.2 实践
            29.2.1 启动类添加注解 @EnableScheduling  开启定时任务
            29.2.2 指定定时任务,方法上使用@Scheduled注解修饰,方法必须是无参无返回值,例如 public void test()
                @Scheduled有两种用法
                    其一:固定速率。
                        fixedDelay=2000(规定延迟2秒执行一次)
                        fixedRate=2000(固定过2秒执行一次)
                        initialDelay=2000 fixedRate=5000 首次执行延迟2秒执行,后续按照fixedRate的规则(过5秒)执行
                    其二:cron表达式,cron表达式生成地址:https://www.matools.com/cron/
                        常用cron表达式:从做到有分别表示的含义为 秒 分 时 日 月 周 年(周的范围是从1-7。为1表示周日,为7表示周六)
                        每秒执行一次:* * * * * ? *
                        每分钟执行一次:0 * * * * ? *
                        每小时执行一次:0 0 * * * ? *
                        每天凌晨2点执行一次:0 0 2 * * ? *
                        每周周一凌晨两点执行一次:0 0 2 ? * 2 *
                        每月1号凌晨两点执行一次:0 0 2 1 * ? *
                        每年1号凌晨两点执行一次: 0 0 2 1 1 ? *            
    30.springboot邮件
        30.1 概述
            springboot默认有starter集成了mail。spring-boot-starter-mail
        30.2 实践 
            先从邮箱设置smtp开启,并获得授权码
            30.2.1 添加依赖
                groupId:org.springframework.boot 
                artifactId:spring-boot-starter-mail 
            30.2.2 修改application.yml配置文件 
                spring:
                    mail:
                        host: smtp.qq.com  #配置服务器qq:smtp.qq.com,网易163:smtp.163.com
                        username: 邮箱账户
                        password: 邮箱密码     
                        default-encoding:UTF-8
            30.2.3 测试
                使用@Autowired注入JavaMailSender对象,使用JavaMailSender的send(MimeMessage)方法或send(SimpleMailMessage)即可发送
                MimeMessageHhelper在邮件中添加附件内容。
    31.补充内容
        实现CommandLineRunner接口,项目启动后会自动执行类中的run方法。应用场景:将数据库中的数据保存到redis缓存中
        redis是单线程
    参考资料:https://blog.csdn.net/m0_47946173/article/details/134659362
    参考资料:https://blog.csdn.net/m0_47946173/article/details/134804733


http://www.kler.cn/a/589899.html

相关文章:

  • RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)
  • Linux驱动开发之中断处理
  • kafka详细介绍以及使用
  • Java语言前言
  • 基于ssm的电子病历系统(全套)
  • 标贝自动化数据标注平台推动AI数据训练革新
  • C#语言的事务管理
  • 卷积神经网络 - 卷积的互相关
  • pytorch 卷积神经网络可视化 通过HiddenLayer和PyTorchViz可视化网络(已解决)
  • java学习总结(八):Spring boot
  • 2025深圳国际数字能源展全球招商启动,聚焦能源产业数字化转型
  • 【C++】*和到底如何使用?关于指针的一些理解
  • OpenCV实现图像特征提取与匹配
  • 最小二乘法的算法原理
  • 【React】useEffect、useLayoutEffect底层机制
  • 工业物联网的“边缘革命”:研华IoT Edge 设备联网与边缘计算的突破与实践
  • 蓝桥杯[每日一题] 模拟题:蚂蚁感冒(java版)
  • 项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>
  • ArcGIS Pro中加载在线地图的详细指南
  • 3.1 Spring Boot性能优化:从线程池调优到JVM参数配置