Spring ,SpringBoot常用配置

文章详细介绍了如何在SpringBoot项目中配置MySQL数据库,包括数据源、Druid连接池的设置。同时,文章涵盖了Swagger2和SpringDoc的使用,用于构建API文档,并展示了SpringFox到SpringDoc的迁移原因。此外,还阐述了Shiro的安全框架集成,包括自定义Realm和登录功能的实现。最后提到了Redis的配置以及SpringBoot中使用Redis的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


MySQL数据库常用数据源:


spring:
  datasource:
    username: root
    password: root
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/book?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #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

  mvc:
    static-path-pattern: /**
  web:
    resources:
      static-locations: [ 'classpath:/static/' ]

MyBatis.xml

<?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">

<!--namespace =绑定接口-->
<mapper namespace="com.book.mapper.UserMapper">
    <!--    这里的id为方法名 resultTYpe为返回的类型 parameterType参数类型-->
    <select id="SelectAll" resultType="com.book.pojo.User">
        select * from user_info;
    </select>

<!--  查询admin密码  -->
    <select id="ByAdmin" resultType="string" parameterType="string">
        select pwd from admin where name=#{name}
    </select>
</mapper>

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>

config常用配置:

package com.hu.SpringBoot01.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
 
@Configuration //说明这是一个配置类
@EnableSwagger2//该注解开启Swagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        //添加head参数配置start
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<>();
        tokenPar.name("Authorization").description("令牌")//请求头,测试token时可以用到
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        pars.add(tokenPar.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                //扫描的路径包,会将包下的所有被@Api标记类的所有方法作为api
                .apis(RequestHandlerSelectors.basePackage("com.hu.SpringBoot01.controller"))
                .paths(PathSelectors.any())//所有接口
                .build()
                .globalOperationParameters(pars);
 
    }
    private ApiInfo webApiInfo() {
        return new ApiInfoBuilder()
                //标题
                .title("lzl的swagger案例Demo")
                //描述
                .description("用于讲解关于swagger的基本配置使用以及注解")
                //许可
                .license("lzl 2021/06/13")
                //许可链接
                .licenseUrl("https://blog.csdn.net/qq_26103133?spm=1001.2101.3001.5343")
                //服务条款网址
                .termsOfServiceUrl("www.spring.io")
                //版本
                .version("1.0")
                //维护人信息
                .contact(new Contact("陆宇轩","www.lzl.com","287547683@qq.com"))
                .build();

    }
}

常用注解:

名称    使用    描述
@Api    controller类上    对请求类的说明
@ApiIgnore    controller类上    隐藏类swagger不会显示
@ApiModel    实体类上    说明实体类的用途
@ApiModelProperty    实体类参数上    说明实体类属性的的含议
@JsonIgnore    实体类参数上    隐藏该实体类属性
@ApiOperation    方法上    方法的说明
@ApiImplicitParams    方法上组合使用    方法的参数的说明
@ApiImplicitParam    方法上    用于指定单个参数的说
@ApiResponses    方法上组合使用    方法返回值状态码的说明
@ApiResponse    方法上    指定单个返回值状态码的说明
@ApiParam    方法参数上    单个方法参数
 

SpringBoot3x以上用SpringDoc

为什么使用SpringDoc呢?
因为集成SpringFox只支持SpringBoot2.x,而基于Swagger的SpringDoc的社区现在十分活跃,版本不断更新。SpringFox自从2020年7月14号之后就不更新了。
SpringDoc也是Spring官方推荐的API。

相关xml依赖

 

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>
<!-- 官方建议是springdoc替代springfox-->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

 配置文件

springdoc:
  swagger-ui:
    path: /swagger-ui.html

本地类

package com.example.Config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("失物招领系统")
                        .description("失物招领系统API文档")
                        .version("v1")
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")))
                .externalDocs(new ExternalDocumentation()
                        .description("外部文档")
                        .url("https://gitee.com/Easonluandchen"));
    }

}

常用注解:

@Tag(name = "用户管理")
@Operation(summary = "用户信息获取")

shoir:

依赖:

        dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.5.3</version>
        </dependency>

用法:

config:

package com.config;

import com.Service.ShiroService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 自定义Realm继承AuthorizingRealm
 * */


public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //授权

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //设置权限
        info.addStringPermission("李四:toLogin");
        return null;
    }

    @Autowired
    public ShiroService service;
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
        //认证

        String principal = (String)Token.getPrincipal();
        String password = service.Login(principal).getPassword();
        return new SimpleAuthenticationInfo(
                ""
                , password
                , "");
    }
}
package com.config;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfig {


    @Bean
    public Subject GetSubject(@Qualifier("securityManager")DefaultSecurityManager defaultWebSecurityManager){

        //设置安全管理器
        SecurityUtils.setSecurityManager(defaultWebSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        return subject;
    }

    //DefaultWebSecurityManager
    @Bean(name="securityManager")
    public DefaultSecurityManager getDefaultSecurityManager(@Qualifier("MyRealm") MyRealm myRealm){
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //关联UserRealm
        securityManager.setRealm(myRealm);

        return securityManager;
    }

    //创建realm对象 ,需要自定义
    @Bean
    public MyRealm MyRealm(){
        return new MyRealm();
    }

}


用法:登录功能

package com.controller;

import com.config.ShiroConfig;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class ShiroController {
    @Autowired
    private ShiroConfig shiroConfig;
    @RequestMapping("/toLogin")
    public String Login(Model model,@RequestParam("name")String name,
                        @RequestParam("password")String password){
        System.out.println(name+"+++++++"+password);
        Subject subject = SecurityUtils.getSubject();
        //登录认证
            UsernamePasswordToken token = new UsernamePasswordToken(name,password);
            try {
                //如账号不存在或密码错误等等,需要根据不同的异常类型来判断用户的登录状态,并给予友好的信息提示
                //调用login后,Shiro就会自动执行自定义的Realm中的认证方法
                subject.login(token);
                return "Test";
            } catch (UnknownAccountException e) {
                //表示用户的账号错误,这个异常是在后台抛出
                System.out.println("---------------账号不存在");
                model.addAttribute("errorMessage","账号不存在");
                return "Login";
            }catch (LockedAccountException e){
                //表示用户的账号被锁定,这个异常是在后台抛出
                System.out.println("===============账号被锁定");
                model.addAttribute("errorMessage","账号被冻结");
                return "Login";
            }catch (IncorrectCredentialsException e){
                //表示用户的密码错误,这个异常是shiro在认证密码时抛出
                System.out.println("***************密码不匹配");
                model.addAttribute("errorMessage","密码错误");
                return "login";
            }
    }
}

Redis:
        依赖:

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

yaml:


spring:
  redis:
    # 地址
    host: 192.168.200.140
    # 端口,默认为6379
    port: 6379
    # 数据库索引
    database: 0
    # 密码
    password: 123456
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

Config:

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final StringRedisTemplate template;

    public MyBean(StringRedisTemplate template) {
        this.template = template;
    }

    // ...

    public Boolean someMethod() {
        return this.template.hasKey("spring");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值