当前位置:   article > 正文

Java高级篇-----Springboot框架_java springboot

java springboot

目录

1.什么是Springboot

2.Springboot框架的特点

3.创建Springboot工程

3.1.准备条件

3.2. 创建springboot的方式有两种

3.2.1. 使用idea快速创建

3.2.2. 基于maven的形式创建

4.介绍springboot中pom文件

5. springboot常见的两种配置文件

简单介绍主启动类

6.读取springboot配置文件中的内容

 6.1.@ConfigurationProperties注解

6.2. @Value注解

7.多环境下开发下的配置---profiles配置详解

7.1.为什么要使用profiles

7.2. 使用方法

8. Springboot注册web三大组件

8.1.注册Servlet到Springboot内置的Tomcat

8.2.注册Filter到springboot内置tomcat

9.springboot整合拦截器 

10.springboot自动包扫描

10.1.如何自动扫描

10.2.如何扫描指定包

11.springboot自动装配原理--->重要

11.1.如何加载自动配置类

11.2.Springboot自动装配的原理

12.springboot整合jdbc数据源

12.1.集成druid数据源

13.springboot整合mybatis

14.springboot整合PageHelper分页插件

15.springboot整合swagger2

15.1 什么是swagger

15.2 为什么使用swagger 

15.3 整合swagger2

16.springboot整合定时器


1.什么是Springboot

Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot 是所有基于 Spring Framework 5.0 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。

springboot可以帮你简化spring的搭建,并且快速创建一个spring的应用程序。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置

2.Springboot框架的特点

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。

3.创建Springboot工程

3.1.准备条件

(1)JDK 环境必须是 1.8 及以上,传送门:jdk1.8.191 下载
(2)后面要使用到 Maven 管理工具 3.2.5 及以上版本.
(3)开发工具建议使用 IDEA,

  (4)   spring的jar必须5.0以上

3.2. 创建springboot的方式有两种

可以有两种创建springboot工程的方式

【1】快速建立---联网

【2】基于maven创建---没有网也可以,但是下jar包还是需要的

3.2.1. 使用idea快速创建

 

 

  

 目录结构的介绍

 

创建一个HelloController类,该类所在的包必须是主函数下的包或子包下。 

3.2.2. 基于maven的形式创建

创建maven工程

  修改pom.xml

1. 引入父工程
2. 加入web依赖

添加applicaiton.properties配置文件

 创建主启动类

创建一个controller类

启动springboot工程并浏览器访问:

4.介绍springboot中pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!--parent: 继承
  6. 如果你的maven项目想成为springboot工程必须继承SpringBoot父依赖
  7. -->
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.3.12.RELEASE</version>
  12. <relativePath/> <!-- lookup parent from repository -->
  13. </parent>
  14. <groupId>com.ykq</groupId>
  15. <artifactId>qy151-springboot</artifactId>
  16. <version>0.0.1-SNAPSHOT</version>
  17. <name>qy151-springboot</name>
  18. <description>Demo project for Spring Boot</description>
  19. <properties>
  20. <java.version>1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <!--web的启动依赖 把spring中常见的jar都集成到该依赖中,集成了springmvc的启动配置类 -->
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.projectlombok</groupId>
  30. <artifactId>lombok</artifactId>
  31. <optional>true</optional>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38. </dependencies>
  39. <build>
  40. <plugins>
  41. <plugin>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-maven-plugin</artifactId>
  44. <configuration>
  45. <excludes>
  46. <exclude>
  47. <groupId>org.projectlombok</groupId>
  48. <artifactId>lombok</artifactId>
  49. </exclude>
  50. </excludes>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

注意:

 默认springboot扫描的包为主启动类所在的包以及子包。

5. springboot常见的两种配置文件

有两种格式的配置文件:

第一种:properties文件 key=值

第二种:yaml文件【缩写为yml】 格式: key:值

不管是哪种只是后缀不同,名称都是以applicaiton开头

第一种: application.properties属性文件

  1. #修改sprintboot中tomcat的端口号
  2. server.port=8081
  3. #修改上下文访问路径
  4. server.servlet.context-path=/qy151
  5. student.id=1
  6. student.name=zhangsan
  7. student.age=20
  8. #student.hobby=LOL,DNF,CF,CSGO #这其实是字符串 实体类数组类型会自动用逗号分隔,变成数组类型
  9. student.hobby[0]=Lol #这才是数组的定义
  10. student.hobby[1]=ppp
  11. student.lists=LOL,AAA,BB,CCC #这里是个字符串,而不是数组
  12. student.maps.clazz=151
  13. student.maps.stuno=110
  14. student.maps.k1=${eee.age}
  15. student.sets=A,B,C,D,D
  16. student.birth=2012/10/01
  17. aaa.age=${random.int}
  18. bbb.age=${random.int(1,100)}
  19. ccc.age=${random.long}
  20. ddd.age=${random.long(1,200)}
  21. eee.age=${random.uuid}

student.hobby=LOL,DNF,CF,CSGO    #这其实是字符串  实体类数组类型会自动用逗号分隔,变成数组类型
student.hobby[0]=Lol #这才是数组的定义

第二种: application.yml文件

  1. # 他们具有层级结构
  2. # key和value 必须有空格
  3. # 这里面如果两个都配置了相同的内容,属性文件properties的优先级高于yml文件
  4. # 如果两个文件的内容内容不同,合并内容
  5. #修改sprintboot中tomcat的端口号
  6. server:
  7. port: 8082
  8. #修改访问路径
  9. servlet:
  10. context-path: /qy151
  11. student:
  12. id: 1
  13. name: lisi
  14. age: 22
  15. hobby:
  16. - LOL
  17. - CF
  18. - DNF
  19. lists:
  20. - LOL
  21. - AAA
  22. - BBB
  23. - CCC
  24. maps:
  25. clazz: 151
  26. stuno: 100
  27. sets:
  28. - A
  29. - B
  30. - C
  31. - D
  32. birth: 2000/10/02
  33. aaa:
  34. age: ${random.int(1,100)}

不管是哪种,他们的名字必须以application开始。

如果两个配置文件同时存在,而且有些内容一样。按照properties的优先级高。如果有些不一样,两个配置文件不一样的会合并在一起。

Properties 没有层级关系 使用=赋值

Yml 有层级关系 使用: 赋值

两种语法的配置是互补的

简单介绍主启动类

6.读取springboot配置文件中的内容

例如OSS文件上传

密钥和bucket名称等---密钥和bucket都写死在java代码中。如果后期修改密钥和bucket的值,你必须修改源码代码。 我们要写在配置文件。然后通过代码在读取配置文件中的密钥和bucket.

如何读取springboot配置文件的内容呢?

(1)@ConfigurationProperties----在类上使用。

(2)@Value注解----直接在类属性上使用。

 6.1.@ConfigurationProperties注解

该注解使用在类上。

  1. package com.wzh.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.stereotype.Component;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Set;
  11. /**
  12. * @ProjectName: springboot-0721
  13. * @Package: com.wzh.entity
  14. * @ClassName: Student
  15. * @Author: 王振华
  16. * @Description:
  17. * @Date: 2022/7/21 20:09
  18. * @Version: 1.0
  19. */
  20. @Data
  21. @AllArgsConstructor
  22. @NoArgsConstructor
  23. @Component //该类对象的创建和销毁都有spring容器来管理
  24. @ConfigurationProperties(prefix = "student") //读取springboot中的配置内容
  25. public class Student {
  26. private Integer id;
  27. private String name;
  28. private String[] hobby;
  29. private List<String> lists;
  30. private Map<String,Object> maps;
  31. private Set<String> sets;
  32. private Integer age;
  33. private Date birth;
  34. }
  1. package com.wzh.controller;
  2. import com.wzh.entity.Student;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. /**
  9. * @ProjectName: springboot-0721
  10. * @Package: com.wzh.controller
  11. * @ClassName: HelloController
  12. * @Author: 王振华
  13. * @Description:
  14. * @Date: 2022/7/21 19:36
  15. * @Version: 1.0
  16. */
  17. @RestController
  18. public class HelloController {
  19. @Autowired //spring容器帮你注入该对象
  20. private Student student;
  21. @GetMapping("/student")
  22. public Student stu(){
  23. System.out.println(student);
  24. return student;
  25. }
  26. @GetMapping("/hello")
  27. public Map<String,Object> hello(){
  28. Map<String,Object> map = new HashMap<>();
  29. map.put("name","张三");
  30. map.put("age",15);
  31. return map;
  32. }
  33. }

6.2. @Value注解

只能放在我们的类属性上。而且它只能读取基本类型和字符串类型

  1. package com.wzh.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.stereotype.Component;
  8. import java.util.Date;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Set;
  12. /**
  13. * @ProjectName: springboot-0721
  14. * @Package: com.wzh.entity
  15. * @ClassName: Student
  16. * @Author: 王振华
  17. * @Description:
  18. * @Date: 2022/7/21 20:09
  19. * @Version: 1.0
  20. */
  21. @Data
  22. @AllArgsConstructor
  23. @NoArgsConstructor
  24. //该类对象的创建和销毁都有spring容器来管理
  25. @Component
  26. //读取springboot中的配置内容
  27. //@ConfigurationProperties(prefix = "student")
  28. public class Student {
  29. @Value("${student.id}")
  30. private Integer id;
  31. @Value("${student.name}")
  32. private String name;
  33. @Value("${student.hobby}")
  34. private String[] hobby;
  35. //@Value("${student.lists}")
  36. private List<String> lists;
  37. //@Value("${student.maps}")
  38. private Map<String,Object> maps;
  39. private Set<String> sets;
  40. @Value("${student.age}")
  41. private Integer age;
  42. @Value("${student.birth}")
  43. private Date birth;
  44. }
  1. package com.wzh.controller;
  2. import com.wzh.entity.Student;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * @ProjectName: springboot-0721
  11. * @Package: com.wzh.controller
  12. * @ClassName: HelloController
  13. * @Author: 王振华
  14. * @Description:
  15. * @Date: 2022/7/21 19:36
  16. * @Version: 1.0
  17. */
  18. @RestController
  19. public class HelloController {
  20. @Autowired //spring容器帮你注入该对象
  21. private Student student;
  22. @Value("${student.id}")
  23. private Integer id;
  24. @GetMapping("/student")
  25. public Student stu(){
  26. System.out.println(student);
  27. return student;
  28. }
  29. @GetMapping("/hello")
  30. public Map<String,Object> hello(){
  31. Map<String,Object> map = new HashMap<>();
  32. map.put("name","张三");
  33. map.put("age",15);
  34. return map;
  35. }
  36. }

 注意:

1,如果配置是写在properties里面

只有Map不能取到

2,如果配置写在yml 数组 集合 都取不到

3,如果属性是使用驼峰命名法则不能使用属性名注入,要使用@Value("${student.user-name}")来取值

不能使用@Value("${student.userName}")来取值

7.多环境下开发下的配置---profiles配置详解

7.1.为什么要使用profiles

思考: 我们在实际开发中,环境有哪些?

开发环境---->测试环境---->上线环境 由于环境的不同,那么就会有不同的配置内容。

难道我们不断的修改配置内容。----不会

实际工作中,针对不同的环境配置不同的配置文件,然后再总的配置文件中激活相应的配置文件。那么如何快速的切换呢,这里就要使用profiles文件

针对不同的环境设置不同的配置文件,然后在主配置中激活相应环境的配置。

applicaiton-环境.properties[yml]

7.2. 使用方法

1,创建applicatin-dev.properties
server.port=8081
2,创建applicatin-test.properties
server.port=8082

3,创建applicatin-prod.properties

server.port=8083
4,修改application.properties
spring.profiles.active=dev

在application.properteis里面激活哪个文件就会使用哪个端口

只需要写-后面的内容   

8. Springboot注册web三大组件

什么是web的三个组件?

Servlet和Filter以及Linstener监听器。

为什么要注册这三个组件呢?

因为我们未来在开发时,有可能要集成第三方框架,而第三方框架的底层可能就依赖于过滤器或者servlet.

第三方就要求你把人家的filter注册到springboot中。比如:shiro权限框架,它的底层就是基于Filter过滤器,把该过滤器注册到Tomcat容器。因为我们的springboot没有了web.xml文件。

8.1.注册Servlet到Springboot内置的Tomcat

如何注册呢?

思考: 早期:

<1>Servlet类

<2>注册到Tomcat容器web.xml

<servlet>
    <servlet-name></servlet-name>
    <servlet-class>Servlet类</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name></servlet-name>
     </url-parterrn>/</url-parterrn>
</servlet-mapping>

现在:都没有web.xml

(1)创建一个Servlet

  1. package com.wzh.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.ServletRequest;
  4. import javax.servlet.ServletResponse;
  5. import javax.servlet.http.HttpServlet;
  6. import java.io.IOException;
  7. /**
  8. * @ProjectName: springboot-0721
  9. * @Package: com.wzh.servlet
  10. * @ClassName: MyServlet
  11. * @Author: 王振华
  12. * @Description:
  13. * @Date: 2022/7/21 21:03
  14. * @Version: 1.0
  15. */
  16. public class MyServlet extends HttpServlet {
  17. @Override
  18. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  19. System.out.println("--------servlet--------");
  20. }
  21. }

  (2)创建一个配置类:

  1. package com.wzh.config;
  2. import com.wzh.servlet.MyServlet;
  3. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import javax.servlet.Servlet;
  7. /**
  8. * @ProjectName: springboot-0721
  9. * @Package: com.wzh.config
  10. * @ClassName: MyConfig
  11. * @Author: 王振华
  12. * @Description: 配置类
  13. * @Date: 2022/7/21 21:04
  14. * @Version: 1.0
  15. */
  16. @Configuration //该类为配置类 等价于.xml文件
  17. public class MyConfig {
  18. @Bean //把返回的对象,放入到spring容器。 理解为配置文件中<bean >
  19. public ServletRegistrationBean<Servlet> registrationBean(){
  20. //创建一个Servlet注册器.
  21. ServletRegistrationBean<Servlet> registrationBean = new ServletRegistrationBean<>();
  22. registrationBean.setName("my");//设置servlet名称
  23. //注册我们的servlet
  24. registrationBean.setServlet(new MyServlet()); //注册自定义servlet,之后是第三方的Servlet
  25. //设置servlet的初始化参数
  26. Map<String, String> map=new HashMap<>();
  27. map.put("name","张三");
  28. registrationBean.setInitParameters(map);
  29. //设置servlet的映射,请求路径
  30. registrationBean.addUrlMappings("/my","/userServlet","/hehe");
  31. return registrationBean;
  32. }
  33. }

测试 

8.2.注册Filter到springboot内置tomcat

以前如何注册过滤器: web.xml

​ <filter>

​ <filter-name></filter-name>

​ <filter-class></filter-class>

​ </filter>

​ <filter-mapping>

​ <filter-name></filter-name>

​ <url-partter></url-partter>

​ </filter-mapping>

(1)创建Filter类,未来使用第三方的

  1. public class AppFilter implements Filter {
  2. @Override
  3. public void init(FilterConfig filterConfig) throws ServletException {
  4. String env = filterConfig.getInitParameter("env");
  5. String hello = filterConfig.getInitParameter("hello");
  6. System.out.println(env+" "+hello);
  7. }
  8. @Override
  9. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  10. System.out.println("doFilter");
  11. chain.doFilter(request,response);
  12. }
  13. @Override
  14. public void destroy() {
  15. }
  16. }

(2)filter注册到配置类中

  1. //配置filetr
  2. @Bean
  3. public FilterRegistrationBean filterRegistrationBean(){
  4. FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
  5. bean.setName("myFilter");
  6. bean.setFilter(new AppFilter());
  7. bean.addUrlPatterns("/*");
  8. return bean;
  9. }

9.springboot整合拦截器 

拦截器:他只会对静态资源和接口路径进行拦截,不会拦截jsp模板引擎。

(1)自定义拦截器

  1. package com.wzh.intercepter;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. /**
  6. * @ProjectName: springboot-0721
  7. * @Package: com.wzh.intercepter
  8. * @ClassName: MyInterceptor
  9. * @Author: 王振华
  10. * @Description:
  11. * @Date: 2022/10/27 13:48
  12. * @Version: 1.0
  13. */
  14. public class MyInterceptor implements HandlerInterceptor {
  15. @Override
  16. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  17. System.out.println("============拦截器==========");
  18. return false;
  19. }
  20. }

(2)修改配置文件,继承WebMvcConfigurationSupport类,注册自定义拦截器。

  1. package com.wzh.config;
  2. import com.wzh.filter.AppFilter;
  3. import com.wzh.intercepter.MyInterceptor;
  4. import com.wzh.servlet.MyServlet;
  5. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  6. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  11. import javax.servlet.Filter;
  12. import javax.servlet.Servlet;
  13. /**
  14. * @ProjectName: springboot-0721
  15. * @Package: com.wzh.config
  16. * @ClassName: MyConfig
  17. * @Author: 王振华
  18. * @Description: 配置类
  19. * @Date: 2022/7/21 21:04
  20. * @Version: 1.0
  21. */
  22. @Configuration //该类为配置类 xml文件
  23. public class MyConfig extends WebMvcConfigurationSupport {
  24. //注册自定义拦截器:拦截器只会拦截controller接口路径,不会拦截servlet路径
  25. @Override
  26. protected void addInterceptors(InterceptorRegistry registry) {
  27. //excludePathPatterns("/hello") 放行路径
  28. // addPathPatterns("/**") 拦截路径
  29. registry.addInterceptor(new MyInterceptor()).excludePathPatterns("/hello").addPathPatterns("/**");
  30. }
  31. @Bean //理解为配置文件中<bean >
  32. public ServletRegistrationBean<Servlet> registrationBean() {
  33. //创建一个Servlet注册器.
  34. ServletRegistrationBean<Servlet> registrationBean = new ServletRegistrationBean<>();
  35. registrationBean.setName("my");
  36. registrationBean.setServlet(new MyServlet()); //之后是第三方的Servlet
  37. registrationBean.addUrlMappings("/my");
  38. return registrationBean;
  39. }
  40. //配置filetr
  41. @Bean
  42. public FilterRegistrationBean filterRegistrationBean() {
  43. FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
  44. bean.setFilter(new AppFilter());
  45. bean.addUrlPatterns("/*");
  46. return bean;
  47. }
  48. }

  1. package com.wzh.controller;
  2. import com.wzh.entity.Student;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * @ProjectName: springboot-0721
  11. * @Package: com.wzh.controller
  12. * @ClassName: HelloController
  13. * @Author: 王振华
  14. * @Description:
  15. * @Date: 2022/7/21 19:36
  16. * @Version: 1.0
  17. */
  18. @RestController
  19. public class HelloController {
  20. @Autowired //spring容器帮你注入该对象
  21. private Student student;
  22. @Value("${student.id}")
  23. private Integer aaa;
  24. @GetMapping("/student")
  25. public Student stu() {
  26. System.out.println(aaa);
  27. return null;
  28. }
  29. @GetMapping("/hello")
  30. public Map<String, Object> hello() {
  31. Map<String, Object> map = new HashMap<>();
  32. map.put("name", "张三");
  33. map.put("age", 15);
  34. return map;
  35. }
  36. @GetMapping("/index")
  37. public String index(){
  38. System.out.println("index");
  39. return "index";
  40. }
  41. }

这里只会拦截student和index,hello被设置为放行路径 

10.springboot自动包扫描

默认springboot自动扫描,主启动类所在的包及其子包都可以自动扫描

10.1.如何自动扫描

@SpringBootApplication

 @EnableAutoConfiguration

 @AutoConfigurationPackage

 点进Registrar

  1. public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
  2. AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
  3. }

 找到getPackageNames()方法,debug断点运行一遍就能看到扫描的包

10.2.如何扫描指定包

  1. package com.wzh;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. //指定扫描的包以及子包
  5. @SpringBootApplication(scanBasePackages = "com.wzh")
  6. public class Springboot0721Application {
  7. //加载那含有@SpringBootApplication注解的类,它的特殊之处就是该类使用了@SpringBootApplication ,它是一个复合注解。
  8. //@EnableAutoConfiguration
  9. public static void main(String[] args) {
  10. SpringApplication.run(Springboot0721Application.class, args);
  11. }
  12. }

11.springboot自动装配原理--->重要

我们没有配置任何关于spring的配置,为什么可以有效果。springboot会自动加载很多装载类,而这些装配类,可以完成相应的装配功能。 

非常详细的SpringBoot-自动装配原理 - 帅哥的爸爸 - 博客园 (cnblogs.com)

什么是自动装配?

无需手动加载某些配置,而由Springboot自动加载进来。

譬如: 自己加载DispatcherServlet.

11.1.如何加载自动配置类

 可以看到该注解是一个复合注解,该复合注解中最重要的组件@EnableConfiguration

可以看到@EnableAutoConfiguration 他还是一个复合注解,该注解中最重要的是:

@Import({AutoConfigurationImportSelector.class})

@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector的下面的方法会当Springboot启动时默认加载127【2.7.1】个自动配置类

然后再排除不生效的配置类

为什么总的自动装配类由144个(之前版本2.2.2是127个),还是上边这个方法。

 META-INF/spring.factories所在位置:

因为这些自动装配类都在这个文件中写死了。

新版本位置: 

 为什么最后只加载24个。

因为在pom.xml文件中只引入了一个start标签依赖。

每当pom.xml文件中多引入一个start标签依赖springboot会多加载n个自动装配类

11.2.Springboot自动装配的原理

文字描述:

主函数启动时会运行一个含@springbootApplication注解的类,--->@springbootApplication中含有@EnableAutoconfiguration开启自动配置的功能--->@Import({AutoConfigurationImportselector.class}))该注解会导入
AutoConfigurationImportselector而这个类会加载一些自动装配类。从而完成了自动装配的功能。

 

springboot在启动时会自动去加载带有@SpringBootApplication注解的类,该注解是一个复合注解,这个注解中有一个@EnableAutoConfiguration开启自动配置的注解,该注解也是个复合注解,在该注解中有一个@AutoConfigutationPackage自动配置包的注解,在这个注解内部有一个@Import注解,该注解导入了一个名叫Registar的类,该类中有一个名为registerBeanDefinitions的方法,这个方法就是springboot自动配置包扫描的方法,在这个方法内部调用了getPackageNames()的方法,这个方法会获取我们的主启动类所在的包名。最终,springboot就会根据这个方法获取到我们的包名并根据这个包名自动配置包扫描。这就是springboot自动扫描的原理。
 

如何加载前端控制器

以前的配置

  1. <servlet>
  2. <servlet-name></servlet-name>
  3. <serlver-class>org*****DispatcherServlet</servler-class>
  4. <init-param>
  5. <param-name>
  6. <param-value>
  7. </init-param>
  8. <load-on-startup>1</
  9. </servlet>
  10. <servlet-mapping>
  11. <servler-name></servlet-name>
  12. <url-patten>/ </
  13. </servlet-mapping>

DispatcherServletAutoConfiguration

 

 如何加载编码过滤器

12.springboot整合jdbc数据源

数据源: 指的是数据源。即是: springboot框架连接数据库。

(1)引入依赖

  1.  <!--整合jdbc starter:加入数据源的启动依赖: springboot启动时会加载对应的自动装配类。-->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-jdbc</artifactId>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>mysql</groupId>
  8.             <artifactId>mysql-connector-java</artifactId>
  9.         </dependency>

(2)配置数据源信息---application.yml

  1. #配置数据源
  2. spring:
  3. datasource:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/myaa?serverTimezone=Asia/Shanghai
  6. username: root
  7. password: 123456
  8. max-active: 10
  9. min-idle: 5
  10. max-wait: 5000
  11. initial-size: 5

或 application.properties

  1. # 配置数据源
  2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
  4. spring.datasource.username=root
  5. spring.datasource.password=123456

 (3)测试

  1. @SpringBootTest(classes = {Springboot0722Application.class})
  2. class Springboot0722ApplicationTests {
  3. @Autowired
  4. private DataSource dataSource;
  5. @Test
  6. void contextLoads() throws SQLException {
  7. //验证了springboot可以帮你完成数据源的自动装配功能
  8. System.out.println(dataSource);
  9. System.out.println(dataSource.getConnection());
  10. }
  11. }

如果引入了jdbc的数据源,没有引入mysql依赖,也没有配置数据库连接信息

 原因:

上面默认这个数据源使用的连接池Hikari。如果不想使用默认的连接池,我们可以引入第三方的连接池。

12.1.集成druid数据源

(1)引入依赖

  1. <!--引入数据库连接池druid-->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid-spring-boot-starter</artifactId>
  5. <version>1.2.8</version>
  6. </dependency>

(2)配置文件application.yml

  1. spring:
  2. datasource:
  3. druid:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/myaa?serverTimezone=Asia/Shanghai
  6. username: root
  7. password: 123456
  8. #初始化的个数
  9. initial-size: 5
  10. #最大活跃数
  11. max-active: 10
  12. #最大等待时间
  13. max-wait: 3000
  14. #最小的闲置个数
  15. min-idle: 5

application.properties

  1. spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai
  2. spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
  3. spring.datasource.druid.username=root
  4. spring.datasource.druid.password=root
  5. #初始化的个数
  6. spring.datasource.druid.initial-size=5
  7. # 最大活跃数
  8. spring.datasource.druid.max-active=10
  9. # 最大等待时间
  10. spring.datasource.druid.max-wait=3000
  11. # 最小的闲置个数
  12. spring.datasource.druid.min-idle=5

(3)测试

  1. @SpringBootTest(classes = {Springboot0722Application.class})
  2. class Springboot0722ApplicationTests {
  3. @Autowired
  4. private DataSource dataSource;
  5. @Test
  6. void contextLoads() throws SQLException {
  7. //验证了springboot可以帮你完成数据源的自动装配功能
  8. System.out.println(dataSource);
  9. System.out.println(dataSource.getConnection());
  10. }
  11. }

13.springboot整合mybatis

(1)引入mybatis启动依赖类

  1. <!--引入mybatis的启动依赖-->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.2.2</version>
  6. </dependency>

(2) 修改配置文件appilication.yml

  1. #指定映射文件的路径
  2. mybatis:
  3. mapper-locations: classpath:mapper/*.xml

(3)在主启动类加上注解@MapperScan(basePackages = "com.wzh.mapper")

  1. @SpringBootApplication
  2. @MapperScan(basePackages = "com.wzh.mapper") //为指定的包下的接口生成代理实现类
  3. public class Springboot0722Application {
  4. public static void main(String[] args) {
  5. //加载那含有@SpringBootApplication注解的类,它的特殊之处就是该类使用了@SpringBootApplication ,它是一个复合注解。
  6. //@EnableAutoConfiguration
  7. SpringApplication.run(Springboot0722Application.class, args);
  8. }
  9. }

也可以在mapper接口上加注解@Mapper

  1. package com.wzh.mapper;
  2. import com.wzh.entity.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.springframework.stereotype.Component;
  5. import java.util.List;
  6. /**
  7. * @ProjectName: springboot0722
  8. * @Package: com.wzh.mapper
  9. * @ClassName: UserMapper
  10. * @Author: 王振华
  11. * @Description:
  12. * @Date: 2022/7/22 19:38
  13. * @Version: 1.0
  14. */
  15. //@Mapper
  16. public interface UserMapper {
  17. int insert(User user);
  18. int delete(Integer id);
  19. int update(User user);
  20. User selectById(Integer id);
  21. /**
  22. * 方法描述
  23. * 查询所有
  24. * @return:
  25. */
  26. List<User> selectAll();
  27. }

第一种是 批量    为指定的包下的接口生成代理实现类

第二种需要每个接口都要添加@mapper

(4)测试

  1. @Test
  2. public void selectById(){
  3. HelloController helloController = new HelloController();
  4. CommonResult commonResult = helloController.selectById(1);
  5. System.out.println(commonResult);
  6. }

14.springboot整合PageHelper分页插件

(1)引入依赖

  1. <!--pageHelper的启动依赖 自动装配拦截器-->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.4.2</version>
  6. </dependency>

(2)测试:

  1. @Autowired
  2. private UserMapper userMapper;
  3. @Test
  4. public void test01(){
  5. PageHelper.startPage(1,3);
  6. List<User> users = userMapper.selectAll();
  7. PageInfo<User> pageInfo = new PageInfo<>(users);
  8. System.out.println("当前页码:"+pageInfo.getPageNum());
  9. System.out.println("当前总页码:"+pageInfo.getPages());
  10. System.out.println("总条数:"+pageInfo.getTotal());
  11. System.out.println("当前页码的记录:"+pageInfo.getList());
  12. }

  

15.springboot整合swagger2

15.1 什么是swagger

它是一个接口文档----用来前后端分离的一款文档。

编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。

15.2 为什么使用swagger 

 15.3 整合swagger2

(1)引入swagger依赖

  1. <!--引入swagger2依赖-->
  2. <dependency>
  3. <groupId>com.spring4all</groupId>
  4. <artifactId>swagger-spring-boot-starter</artifactId>
  5. <version>1.9.1.RELEASE</version>
  6. </dependency>
  7. <!--图形化依赖-->
  8. <dependency>
  9. <groupId>com.github.xiaoymin</groupId>
  10. <artifactId>swagger-bootstrap-ui</artifactId>
  11. <version>1.9.6</version>
  12. </dependency>

(2)创建swagger配置类

  1. package com.wzh.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import springfox.documentation.builders.RequestHandlerSelectors;
  5. import springfox.documentation.service.ApiInfo;
  6. import springfox.documentation.service.Contact;
  7. import springfox.documentation.service.VendorExtension;
  8. import springfox.documentation.spi.DocumentationType;
  9. import springfox.documentation.spring.web.plugins.Docket;
  10. import java.util.ArrayList;
  11. import static springfox.documentation.spi.DocumentationType.SPRING_WEB;
  12. /**
  13. * @ProjectName: springboot0722
  14. * @Package: com.wzh.config
  15. * @ClassName: SwaggerConfig
  16. * @Author: 王振华
  17. * @Description:
  18. * @Date: 2022/7/22 20:17
  19. * @Version: 1.0
  20. */
  21. @Configuration //标记该类为配置类
  22. public class SwaggerConfig {
  23. @Bean //swagger中所有的功能都封装在Docket类中。
  24. public Docket docket(){
  25. Docket docket = new Docket(DocumentationType.SWAGGER_2)
  26. .groupName("QY151")
  27. .apiInfo(getInfo()) //设置api文档信息
  28. .select()//设置哪些包下的类生产api接口文档
  29. .apis(RequestHandlerSelectors.basePackage("com.wzh.controller")) //指定为哪些包下的类生成接口文档
  30. .paths(PathSelectors.any())
  31. .build();
  32. return docket;
  33. }
  34. //定义自己接口文档信息
  35. private ApiInfo getInfo(){
  36. Contact DEFAULT_CONTACT = new Contact("王振华", "http://www/baidu.com", "13234@qq.com");
  37. ApiInfo apiInfo = new ApiInfo("员工管理系统API接口文档", "世界上最牛的一个文档", "V1.0", "http://www/jd.com",
  38. DEFAULT_CONTACT, "xx科技有限公司", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList<VendorExtension>());
  39. return apiInfo;
  40. }
  41. }

(3)开启swagger注解

  (4)使用swagger注解

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

@Api:修饰整个类,描述Controller的作用  接口类的注解---接口类上 tag属性
@ApiOperation:描述一个类的一个方法,或者说一个接口  接口方法的注解---接口方法上 value:
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数---- 实体类接口注解
@ApiModelProperty:用对象接收参数时,描述对象的一个字段---->实体类属性的说明
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数

@ApiImplicitParams( 接口参数的说明
    {
      ApiImplicitParam() //单个参数的说明
    }
)

@Api的使用

 @ApiOperation的使用

@ApiImplicitParams   @ApiImplicitParam的使用 

 

@ApiModel   @ApiModelProperty的使用

 (5)访问

第一种: http://localhost:8080/swagger-ui.html

 

 第二种: http://localhost:8080/doc.html

注意:改一下springboot的版本号

16.springboot整合定时器

什么是定时器?

在指定的时间,执行相应的业务代码。

为什么使用定时器?

比如: OSS文件系统服务器,会产生大量冗余文件。定时删除冗余文件【凌晨2~3点】。

比如: 下单后半个未支付--取消订单。

比如:新用户注册后,七天发送问候短信。

如何来使用定时器。

(1)引入定时器依赖。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>

(2)编写定义任务代码。

在线Cron表达式生成器 (pppet.net)https://www.pppet.net/

  1. package com.wzh.config;
  2. import org.springframework.scheduling.annotation.Scheduled;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @ProjectName: springboot-mp
  6. * @Package: com.wzh.config
  7. * @ClassName: QuartzTask
  8. * @Author: 王振华
  9. * @Description:
  10. * @Date: 2022/7/25 19:09
  11. * @Version: 1.0
  12. */
  13. @Component //该类交于spring容器来管理
  14. public class QuartzTask {
  15. //任务代码cron:定于定时任务的规则
  16. // 0/2 * * * * ? 表示每2秒 执行任务
  17. @Scheduled(cron = "0/2 * * * * ?")
  18. public void task01(){
  19. System.out.println("业务代码");
  20. }
  21. }

(3) 开启定时任务的注解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/391648
推荐阅读
相关标签
  

闽ICP备14008679号