Spring Boot

项目开发

Spring Boot原理

Spring Boot有一个全局配置文件:application.properties或application.yml。

通过这个配置文件,我们可以对其中的一些配置按照自己的意愿进行配置。

在使用配置文件之前需要了解一下Spring Boot的自动装配过程,可以让我们对配置文件有更深层次的了解。

在Spring Boot启动类中有一个注解@SpringBootApplication,该注解中有两个比较重要的注解

@SpringBootConfiguration
@EnableAutoConfiguration
  • @EnableAutoConfiguration

    • 该注解的意思是开启自动配置,该注解也是一个派生注解

    • 在该注解中也有两个重要的注解

      @AutoConfigurationPackage
      @Import({AutoConfigurationImportSelector.class})
      
    • @AutoConfigurationPackage:自动配置包

      • @Import({Registrar.class}):自动注册包
    • @Import({AutoConfigurationImportSelector.class})自动配置导入选择(自动导入包的核心

      • 通过注解导入的类AutoConfigurationImportSelector:自动导入选择器

      • 在此类中:

      • //获取获选的配置
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        
      • 核心方法:getCandidateConfigurations 获取候选的配置

        protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
            Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
            return configurations;
        }
        

        在这里插入图片描述

        • 上述的getSpringFactoriesLoaderFactoryClass()方法返回了一个EnableAutoConfiguration.class,该注解就是@SpringBootApplication中的两大核心注解。标注了EnableAutoConfiguration注解的类,也就是主启动类。

        • 上述的第一个方法中调用了loadFactoryNames()方法

          • 该方法获取所有的加载配置,方法返回的loadSpringFactories方法中加载了META-INF/spring.factories配置文件

        在这里插入图片描述

      • spring.factories为核心配置文件

        在这里插入图片描述

        • 里面包含了很多XxxxAutoConfiguration格式的自动配置类,就是这些类给容器中导入了这个场景需要的所有组件。

        • 这些配置类中包含了一个核心的注解@ConditionalOnClass,如果该注解中的条件都满足,当前配置类才会生效。

          • 常见的条件注解

            @ConditionalOnBean:当容器里有指定的bean的条件下。
            
            @ConditionalOnMissingBean:当容器里不存在指定bean的条件下。
            
            @ConditionalOnClass:当类路径下有指定类的条件下。
            
            @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。
            
            @ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true
      • 上述这些操作就是为了让Spring Boot的启动类下的所有资源被加载

application.properties配置文件

  • 通过该配置文件可以修改自动配置类的一些属性,实现配置的自定义。
  • XxxxAutoConfiguration格式的自动配置类中通过@EnableConfigurationProperties({XxxxProperties.class})注解来绑定到对应的Properties类中,在XxxxProperties类中有一个注解@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,以实现对属性的配置。
    • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可。
    • @ConfigurationProperties注解中可以指定前缀,通过这个前缀可以更加便捷的引用到当前配置文件中。
    • 在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。
      • xxxxAutoConfigurartion:自动配置类;给容器中添加组件;
      • xxxxProperties:封装配置文件中相关属性;
      • @EnableConfigurationProperties注解:开启配置属性

在这里插入图片描述

总结:

Spring Boot所有配置都是在启动的时候扫描并加载:spring.factories其中包含了所有的自动配置类,自动配置类不一定会生效,因为这些类中都有一个@ConditionalOnClass注解,只有满足这个注解中所有的条件,自动配置类才会生效,可以通过在依赖中导入对应的start,来得到对应的启动器,有了启动器,注解中的条件就能满足,自动配置类就能生效了。

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

1、项目搭建

  • 在java文件下新建config文件夹
    • 主要是对Spring Boot一些功能的重写和扩展
      • 例如拦截器,实现页面的国际化(页面中英文切换),进行一些简单的视图控制跳转,将自定义的功能注入到容器中。
  • resources文件夹主要存放前端页面,templates文件夹存放前端页面,static文件夹存放一些静态资源,如css样式,图片等等。
    • 在templates文件夹下,可以对页面进一步分类。

2、Thymeleaf

Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。

Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用作静态原型,从而在开发团队中实现更强大的协作。

通过Spring Framework模块,与您喜欢的工具的大量集成,以及插入您自己的功能的能力,Thymeleaf是现代HTML5 JVM Web开发的理想选择 - 尽管它可以做得更多。

我们只需要把我们的html页面放在类路径下的templates文件夹下,thymeleaf就可以帮我们自动渲染了。

  • 导入对应的依赖

    <!--thymeleaf-->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
  • 在需要使用Thymeleaf的页面上需要导入命名空间

    xmlns:th="http://www.thymeleaf.org"
    
  • 基础语法

    • 文本标签:th:text/th:utext
      • th:text 进行文本替换 不会解析html
      • th:utext 进行文本替换 会解析html
    • 字符串拼接
  • 拼接字符串通过 + 或者 | 进行拼接

  • 基础表达式

    • ${.}表示获取变量的值。
      • 正常情况下 *{…} 和 ${…}是一样的,但是 *{…} 一般和 th:object 进行一起使用来完成对象属性的简写。
    • #{.}表示消息表达式,用于国际化message.properties 属性读取。
    • @{.}表示获取URL链接
    • ~{.}表示片段表达式,可以引用片段到页面
  • 常用表达式

    • 条件判断

      • th:if 当条件为true则显示。
      • th:unless 当条件为false 则显示。
    • 循环

      • th:each 遍历集合

        <!--遍历的结果存放在dept中-->
        th:each="dept:${departments}" 
        
    • th:href

      • 用于声明在a 标签上的href属性的链接 该语法会和@{…} 表达式一起使用。

3、基础功能实现

  • 用户输入用户和密码以实现用户登录,通过提交表单的方式实现用户的信息验证

  • 表单:通过提交表单的方式来对页面中的数据进行传递

    <form class="form-signin" th:action="@{/user/login}">
        具体功能的实现
    </form>
    
  • 页面公共部分的抽取

    • 在编写一个网站的时候,我们可以将一些公共的页面片段抽取出来,达到复用的功能。

    • 新建conmmons.html用于存放公共页面

    • 在标签中添加th:fragment=“属性名”,标记为fragment片段

    • 引用:

      <!--使用replace可以达到同样的效果
      	~{包名/文件名::片段属性名}
      -->
      th:insert="~{commons/conmmons.html::topbar}"
      
  • MVC配置类

    • 编写自定义类实现WebMvcConfigurer接口,再添加一个@Configuration注解,表明该类是一个配置类。

      • 通过对接口中一些方法的重写,从而实现对Spring MVC的扩展。
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.servlet.LocaleResolver;
      import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
      import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
      
      //MVC的配置
      @Configuration
      public class MyMvcConfig implements WebMvcConfigurer {
      
          //控制视图的跳转
          @Override
          public void addViewControllers(ViewControllerRegistry registry) {
              registry.addViewController("/").setViewName("index");
              registry.addViewController("/index.html").setViewName("index");
              registry.addViewController("/main.html").setViewName("dashboard");
          }
      }
      
  • 页面国际化

    • resources文件夹下编写i18n文件夹用于存放需要切换的文字。

      • 在i18n文件夹下新建login.properties用于存放默认显示的文字。
      • 新建login_en_US.properties用于存放英文文字。
      • 新建login_zh_CN.properties用于存放中文文字。
    • 在login_en_US.properties和login_zh_CN.properties文件下存放对应的文字。

      • 在IDEA中点击文件下方的Resource Bundle可以更加便捷的编写对应的文字。
    • 在application.properties配置文件中进行配置

      spring.messages.basename=i18n.login
      
    • 在页面对应的文字处进行引用

      <!--对对应的文字进行取值-->
      #{属性名}
      
    • 编写自定义类实现页面语言的自主切换

      import org.springframework.web.servlet.LocaleResolver;
      import org.thymeleaf.util.StringUtils;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.util.Locale;
      
      //实现页面的国际化
      public class MyLocaleResolver implements LocaleResolver {
      
          //解析请求
          @Override
          public Locale resolveLocale(HttpServletRequest httpServletRequest) {
              //获取请求中的语言参数
              String language = httpServletRequest.getParameter("l");
              Locale locale = Locale.getDefault();    //如果没有就是用默认的
              //如果请求的链接携带了国际化的参数
              if (!StringUtils.isEmpty(language)) {
                  //zh_CN
                  String[] split = language.split("_");
                  //国家,地区
                  locale = new Locale(split[0], split[1]);
              }
      
              return locale;
          }
      
          @Override
          public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
      
          }
      }
      
    • 在MVC配置类中将自己写的组件配置到容器中

       //自动化的国家组件就生效了
      @Bean
      public LocaleResolver localeResolver() {
      	return new MyLocaleResolver();
      }
      
    • 在前端页面中接收参数

      <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
      <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
      
    • 容器自动帮我将页面中的文字进行配对,实现页面的国际化。

  • 拦截器

    • 编写自定义类实现HandlerInterceptor接口

      import org.springframework.web.servlet.HandlerInterceptor;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      //编写拦截器,实现用户权限控制
      public class LoginHandlerInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              //登录成功之后,应该有用户的session
              Object loginUser = request.getSession().getAttribute("loginUser");
      
              if (loginUser == null) {
                  //没有登录
                  request.setAttribute("msg", "没有权限,请先登录");
                  request.getRequestDispatcher("/index.html").forward(request, response);
      
                  return false;
              } else {
                  return true;
              }
          }
      }
      
      
    • 在MVC配置类中重写addInterceptors方法

      • addPathPatterns:需要拦截的请求
      • excludePathPatterns:哪些请求不需要拦截
      //将自定义的拦截器配置到容器中
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(new LoginHandlerInterceptor())
              .addPathPatterns("/**")
              .excludePathPatterns("/index.html", "/", "/user/login","/css/**","/js/**", "/img/**");
      }
      
  • 侧边栏点击高亮实现

    <!--其中的list.html是需要高亮页面所携带的参数
    -->
    <a th:class="${active=='list.html'?'nav-link active':'nav-link'}">
    
    • 在需要高亮页面中,通过在导入fragment的HTML代码中携带参数然后传递给侧边栏,然后在侧边栏模块中进行判断。
    <div th:insert="~{commons/conmmons.html::sidebar(active='list.html')}"></div>
    

4、Druid数据源

  • 导入Druid数据源依赖

    <!--druid数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.3</version>
    </dependency>
    
  • Spring Boo 2.0 以上默认使用的数据源是Hikari,可以通过spring.datasource.type 指定数据源

    spring:
      datasource:
        username: root
        password: root
        url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
    
  • 对Druid数据源进行配置

    #SpringBoot默认是不注入这些的,需要自己绑定
    #druid数据源专有配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Properity
    #则导入log4j 依赖就行
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionoProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    
    • 要使用log4j就需要导入其对应的依赖
  • 我们需要自己为DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了。

    • 编写配置类,代码大部分是固定,使用时可以按照自己的需求进行添加和修改
    package com.tian.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    import java.util.HashMap;
    
    @Configuration
    public class DruidConfig {
    
        @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public DataSource druidDataSource() {
            return new DruidDataSource();
        }
    
        //后台监控
        @Bean
        public ServletRegistrationBean statViewServlet() {
            ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
    
            //后台需要有人登陆
            HashMap<String, String> initParameters = new HashMap();
    
            //增加配置
            initParameters.put("loginUsername", "admin");
            initParameters.put("loginPassword", "123456");
    
            //允许谁可以访问
            initParameters.put("allow", "");
    
            bean.setInitParameters(initParameters); //设置初始化参数
            return bean;
        }
    }
    
  • 配置完毕后,可以访问http://localhost:8080/druid/login.html检测是否配置成功。

5、整合Mybatis

  • 导入所需要的依赖

    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    
  • 配置数据库连接信息(这里默认使用的是Hikari数据源,可以按照自己的需求配置数据源)

    spring:
      datasource:
        username: root
        password: root
        url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver
    # 整合mybatis
    mybatis:
      type-aliases-package: com.tian.pojo
      mapper-locations: classpath:mybatis/mapper/*.xml
    
  • 创建实体类(这里需要导入lombok依赖)

    package com.tian.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private int id;
        private String name;
        private String pwd;
    }
    
  • 编写对应的mapper接口

    package com.tian.mapper;
    
    import com.tian.pojo.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    //@Mapper这个注解表示了这个一个mybatis的Mapper类
    //dao层使用@Repository注解
    @Mapper
    @Repository
    public interface UserMapper {
        //查询所有用户
        List<User> queryUserList();
    
        //查询一个用户
        User queryUserById(int id);
    
        //增加一个用户
        int addUser(User user);
    
        //修改用户
        int update(User user);
    
        //删除用户
        int delete(int id);
    }
    
  • 编写对应的mapper映射文件

    • 建议在resources目录下新建mybatis文件夹,再在mybatis文件夹下新建mapper文件夹用于存放映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.tian.mapper.UserMapper">
        
        <select id="queryUserList" resultType="User">
            select * from user
        </select>
    
        <select id="queryUserById" resultType="User" parameterType="_int">
            select * from USER where id = #{id}
        </select>
    
        <insert id="addUser" parameterType="User">
            insert into user VALUES (#{id},#{name},#{pwd})
        </insert>
    
        <update id="update" parameterType="User">
            update user set name = #{name}, pwd = #{pwd}
                where id=#{id}
        </update>
    
        <delete id="delete" parameterType="_int">
            delete * from user where id = #{id}
        </delete>
    
    </mapper>
    
  • 编写service层

    package com.tian.service;
    
    import com.tian.mapper.UserMapper;
    import com.tian.pojo.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        //查询所有用户
        public List<User> queryUserList(){
            return userMapper.queryUserList();
        }
    
        //查询一个用户
        public User queryUserById(int id){
            return userMapper.queryUserById(id);
        }
    
        //增加一个用户
        public int addUser(User user){
            return userMapper.addUser(user);
        }
    
        //修改用户
        public int update(User user){
            return userMapper.update(user);
        }
    
        //删除用户
        public int delete(int id){
            return userMapper.delete(id);
        }
    }
    
  • 最后编写controller层进行测试即可。

6、Spring Security

Spring Security是一个功能强大且高度可定制的身份验证访问控制框架。它实际上是保护基于spring的应用程序的标准。

Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求。

  • spring security 的核心功能主要包括:

    • 认证 (你是谁)
    • 授权 (你能干什么)
    • 攻击防护 (防止伪造身份)
  • 导入Spring Security依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
  • 编写 Spring Security 配置类

    package com.kuang.config;
     
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
     
    @EnableWebSecurity // 开启WebSecurity模式
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            
        }
    }
    
    • 定制请求的授权规则

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          // 定制请求的授权规则
          // 首页所有人可以访问
          http.authorizeRequests().antMatchers("/").permitAll()
          .antMatchers("/level1/**").hasRole("vip1")
          .antMatchers("/level2/**").hasRole("vip2")
          .antMatchers("/level3/**").hasRole("vip3");
      }
      
    • 在configure()方法中加入以下配置,开启自动配置的登录功能!

      // 开启自动配置的登录功能
      // /login 请求来到登录页
      // /login?error 重定向到这里表示登录失败
      http.formLogin();
      
    • 定义认证规则

      //认证
      /*
              密码编码:PasswordEncoder
              在Spring Security 5.0+新增了许多加密方式,用户必须对密码进行加密,否则不能使用
           */
      @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
          auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
              .withUser("tian").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
              .and()
              .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
              .and()
              .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
      }
      
  • Spring Security - thymeleaf整合

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
      <dependency>
          <groupId>org.thymeleaf.extras</groupId>
          <artifactId>thymeleaf-extras-springsecurity5</artifactId>
          <version>3.0.4.RELEASE</version>
      </dependency>
      
    • 导入命名空间

      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
      
  • 定制登录页

    http.formLogin().loginPage("请求地址");
    

7、Swagger

简介

  • 前端和后端间通过API接口进行联系,API文档变成了前后端开发人员联系的纽带。
  • Swagger就是一款能很好的书写API文档的框架。
  • Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新

Spring Boot集成Swagger

  • 导入依赖

    <!--swagger-->
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    
  • 编写Swagger配置类SwaggerConfig来配置 Swagger

    @Configuration //表明这个类是一个配置类
    @EnableSwagger2// 开启Swagger2的自动配置
    public class SwaggerConfig {  
    }
    
  • 访问:http://localhost:8080/swagger-ui.html ,可测试是否配置完成。

  • 在Swagger配置类SwaggerConfig中,自定义Swagger的一些配置。

    //配置Swagger信息=apiInfo,替换掉默认的信息
    private ApiInfo apiInfo() {
        //作者信息
        Contact contact = new Contact("天", "www.baidu.com","2426793192@qq.com");
    
        return new ApiInfo(
            "Swagger学习"
            , "Swagger文档"
            , "1.0"
            , "www.baidu.com"
            , contact
            , "Apache 2.0"
            , "http://www.apache.org/licenses/LICENSE-2.0"
            , new ArrayList());
    }
    
    • Docket实例关联上自定义的apiInfo()
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }
    
  • 配置扫描接口

    • 通过配置扫描接口可以自定义Swagger要扫描哪些包,哪些请求需要显示在API文档上。

    通过在注入Docket实例时配置一些信息

    //配置了Swagger的Docket的bean实例
    @Bean
    public Docket docket(Environment environment) {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            //RequestHandlerSelectors 配置要扫描接口的方式
            //basePackage:指定要扫描的包
            .apis(RequestHandlerSelectors.basePackage("com.tian.swagger.controller"))
            .build();
    }
    
  • 配置Swagger开关

    • 在实际开发中会存在几个不同的环境,通过新建properties配置文件的方式来规划好不同开发环境需要使用到的配置在这里插入图片描述

    • 开发时会使用Swagger,在项目正式交付运行之后会关闭掉Swagger,不然会泄露该项目的API接口。

    • 在主配置文件application.properties中,可以选择要使用到的开发环境

      # 表示当前使用到的是dev开发环境
      spring.profiles.active=dev
      
    • 通过enable()方法配置是否启用swagger,如果是false,swagger将不能在浏览器中访问了。

    @Bean
    public Docket docket(Environment environment) {
        // 设置要显示swagger的环境
        Profiles profiles = Profiles.of("dev", "test");
        //通过environment.acceptsProfiles判断是否处在自己设定的环境中
        boolean flag = environment.acceptsProfiles(profiles);
        
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .enable(flag) //配置是否启用Swagger,如果是false,在浏览器将无法访问
            .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
            .apis(RequestHandlerSelectors.basePackage("com.tian.swagger.controller"))
            // 配置如何通过path过滤,即这里只扫描请求以/tian开头的接口
            .paths(PathSelectors.ant("/tian/**"))
            .build();
    }
    
  • API分组

    @Bean
    public Docket docket(Environment environment) {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
            .groupName("hello") // 设置分组名称
            // 省略配置....
    }
    
    • 通过配置多个Docket即可实现创建多个组,通过groupName来区分组名。
  • 常用注解

    Swagger注解说明
    @Api(tags = “xxx模块说明”)作用在模块类上
    @ApiOperation(“xxx接口说明”)作用在接口方法上
    @ApiModel(“xxxPOJO说明”)作用在模型类上:如VO、BO
    @ApiModelProperty(value = “xxx属性说明”,hidden = true)作用在类方法和属性上,hidden设置为true可以隐藏该属性
    @ApiParam(“xxx参数说明”)作用在参数、方法和字段上,类似@ApiModelProperty
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值