springboot相关知识合集

目录

spring发展史

Springboot简介

Springboot使用

环境信息

idea中搭建一个springboot工程

springboot注解说明

热部署

springboot启动时加载配置文件

springboot @Mapper使用

springboot mybatis使用别名

springboot mybatis设置map返回时 如果为空返回null值

springboot 设置过滤器

springboot 设置拦截器

springboot servlet上下文监听器

springboot 定时任务

springboot 数据库连接池配置

默认数据库连接池:hikari 号称“史上最快连接池”

Druid数据库连接池(阿里自研可以很方便的监控性能)

springboot lombok

springboot 日志配置


spring发展史

第一阶段:xml配置

在Spring 1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件放到不同的配置文件里,那时需要频繁的在开发的类和配置文件之间进行切换

第二阶段:注解配置

在Spring 2.x 时代,随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解(例如@Component、@Service),大大减少了配置量。主要使用的方式是应用的基本配置(如数据库配置)用xml,业务配置用注解

第三阶段:java配置

Spring 3.0 引入了基于 Java 的配置能力,这是一种类型安全的可重构配置方式,可以代替 XML。我们目前刚好处于这个时代,Spring4.x和Spring Boot都推荐使用Java配置。

Springboot简介

简介:SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

特点:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置。

策略:

(1)开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。

(2)约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。

Springboot使用

环境信息

数据库:MySQL

IDE:idea

Spring-Boot:2.2.6

Maven: 3.3.9

idea中搭建一个springboot工程

传送门:https://blog.csdn.net/qq_26154077/article/details/105458395

springboot注解说明

引导类中使用
    //注解表示当前类是springboot的应用
    @SpringBootApplication
    //设置包扫描路径
    @ComponentScan(basePackages = "com.anran.springboot")

配置类中使用
    // 配置类说明
    @Configuration

Bean类使用
    // 接口配置(@Controller和@ResponseBody)
    @RestController
    // 接口配置
    @Controller
    // 路径对外别名,请求方式以及请求参数类型
    @RequestMapping("/testController")
    // 返回信息说明
    @ResponseBody
    // bean的声明
    @Service
    // dao bean的声明
    @Mapper
    // 依赖注入
    @Autowired
    // lombok的注解,用于自动生成对象属性的get和set方法
    @Data

过滤器注解
   // 过滤器描述
   @WebFilter(filterName = "myFilter", urlPatterns = "/*")  (public class MyFilter implements Filter)

servlt上下文监听器
    @WebListener (public class MyListener implements ServletContextListener)

定时任务
    // 开启定时任务
    @EnableScheduling
    // 定时逻辑
    @Scheduled(cron/fixedRate/fixedDelay/initialDelay)

声明bean
    @Bean:声明在方法上,将方法的返回值加入Bean容器,代替标签

@PropertySource:指定外部属性文件

热部署

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

springboot启动时加载配置文件

项目在启动时会查找config/classpath目录下的application文件(后缀包含properties、xml、yml、yaml)

以yml配置说明为例

application.yml(设置环境,用于多环境部署)

spring:
  profiles:
    active: dev

application-dev.yml(开发环境配置)

server:
  port: 8082

spring:
  datasource:
    username: root
    password: jkgjghjg9
    url: jdbc:mysql://localhost:3306/project_manage?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.anran.example.model

logging:
  file: /usr/log/example.log
  level:
    root: INFO
    com.anran.projectmanage.mapper: DEBUG

springboot @Mapper使用

方式1:

package com.anran.example.mapper;


import com.anran.example.model.TestModel;
import org.apache.ibatis.annotations.*;

@Mapper
public interface MyTestMapper {

    // 查找信息
    @Select("select id, date_format(now(), '%Y%m%d%H%i%s') as content from test where id = #{id}")
    TestModel get(int id);

    // 插入信息
    @Insert({ "insert into test(content) values(#{content})" })
    // 返回自增主键
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(TestModel model);

    // 插入信息
    @Update({ "update test set content = #{content} where id = #{id}" })
    int update(TestModel model);

    // 删除信息
    @Update({ "delete from test where id = #{id}" })
    int delete(int id);
}

方式2;

package com.anran.example.mapper;


import com.anran.example.model.TestModel;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestMapper {

    TestModel get(int id);
}


<?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.anran.example.mapper.TestMapper">
    <select id="get" parameterType="int" resultType="com.anran.example.model.TestModel">
        select
          id, content
        from
          test
        where
          id = #{id};
    </select>
</mapper>

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.anran.example.model

springboot mybatis使用别名

mybatis:
  # 设置mapper映射类
  mapper-locations: classpath:mapper/*Mapper.xml
  # 设置model模型别名
  type-aliases-package: com.anran.example.model

mapper.xml中使用
<select id="get" parameterType="int" resultType="TestModel">
  select id, content from test where id = #{id};
</select>

springboot mybatis设置map返回时 如果为空返回null值

mybatis:
  # 设置mapper映射类
  mapper-locations: classpath:mapper/*Mapper.xml
  # 设置model模型别名
  type-aliases-package: com.anran.example.model
  # 设置map结果时如果是null也要返回key
  configuration:
    call-setters-on-nulls: true

springboot 设置过滤器

方式1:@WebFilter

package com.anran.example.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(MyFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

方式2:@Configuration和@Bean

配置文件:MyConfig.java

package com.anran.example.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {

    @Bean
    public FilterRegistrationBean registMyFilter1() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter1());
        registration.addUrlPatterns("/*"); // 过滤url
        registration.addInitParameter("paramName", "paramValue"); // 初始化参数
        registration.setName("MyFilter1"); // 过滤器名称
        registration.setOrder(1); // 过滤器顺序
        return registration;
    }

    @Bean
    public FilterRegistrationBean registMyFilter2() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter2());
        registration.addUrlPatterns("/*"); //
        registration.addInitParameter("paramName", "paramValue"); //
        registration.setName("MyFilter2");
        registration.setOrder(2);
        return registration;
    }
}

过滤器1:

package com.anran.example.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

public class MyFilter1 implements Filter {

    private static final Logger log = LoggerFactory.getLogger(MyFilter1.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter1 init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter1 doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

过滤器2:

package com.anran.example.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

public class MyFilter2 implements Filter {

    private static final Logger log = LoggerFactory.getLogger(MyFilter2.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter2 init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter2 doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

springboot 设置拦截器

package com.anran.example.filter;

import com.anran.example.Interceptor.MyInterceptor;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/zxc/foo").setViewName("foo");
    }
    // 拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/*");
    }
}

package com.anran.example.Interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
    // 接口请求之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        log.info("preHandle被调用");
        // true请求继续,false请求直接结束(参数校验,用户登录)
        return true;
    }
    // 接口请求之后,返回之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被调用");
    }
    // 返回之后
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion被调用");
    }
}

springboot servlet上下文监听器

package com.anran.example.listener;

import com.anran.example.Interceptor.MyInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyListener implements ServletContextListener {
    private static final Logger log = LoggerFactory.getLogger(MyListener.class);

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("MyListener destory");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("MyListener init");
    }
}

springboot 定时任务

传送门:https://blog.csdn.net/qq_26154077/article/details/102789589

springboot 数据库连接池配置

默认数据库连接池:hikari 号称“史上最快连接池”

application.yml

spring:
  datasource:
    username: root
    password: axxxxxxxxxxxxx9
    url: jdbc:mysql://localhost:3306/project_manage?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
    # Hikari 连接池配置
    hikari:
      # 空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 180000
      # 最小空闲连接数量
      minimum-idle: 5
      # 连接池最大连接数,默认是10
      maximum-pool-size: 10
      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      # 连接池名称
      pool-name: MyHikariCP
      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      # 测试验证查询
      connection-test-query: SELECT 1

Druid数据库连接池(阿里自研可以很方便的监控性能)

pom.xml

<!-- Druid连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

application.yml

spring:
  # 配置数据库信息
  datasource:
    druid:
      # 数据源配置
      username: root
      password: ajl930919
      url: jdbc:mysql://localhost:3306/project_manage?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 初始化 最小 最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置获取连接等待超时的时间
      max-wait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置多个英文逗号分隔
      filters: stat,wall
      # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
      # 是否启用StatFilter默认值true
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: false
        session-stat-max-count: 1000
        principal-cookie-name: admin
        principal-session-name: admin
        profile-enable: true
      # 根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html
      # http://loacalhsot:8081/druid
      stat-view-servlet:
        url-pattern: /druid/*  # 监控页面访问路径
        # 允许清空统计数据
        reset-enable: true
        login-username: admin
        login-password: 123456
          # StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置allow和deny这两个参数
          # deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。如果allow没有配置或者为空,则允许所有访问
          # 配置的格式
          # <IP>
          # 或者<IP>/<SUB_NET_MASK_size>其中128.242.127.1/24
        # 24表示,前面24位是子网掩码,比对的时候,前面24位相同就匹配,不支持IPV6。
        allow:
        deny:
DruidStatController.java
package com.anran.example.controller;

import com.alibaba.druid.stat.DruidStatManagerFacade;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DruidStatController {
    @GetMapping("/durid/stat")
    public Object druidStat(){
        // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
    }
}

浏览器输入:http://localhost:8082/druid/login.html   账号:admin   密码:123456

ps:druid使用1.1.10以上版本出现页面无法访问,暂未解决

springboot lombok

idea配置lombok传送门:https://blog.csdn.net/qq_26154077/article/details/105901638

 

springboot 日志配置

Spring Boot 默认的日志框架 logback,spring-boot-starter其中包含了 spring-boot-starter-logging的依赖。

application.yml

logging:
  # 日志级别
  level:
    # 没有设置的统一级别
    root: INFO
    # 对应包下面的日志级别
    com.anran.projectmanage.mapper: DEBUG
  file:
    # 日志名称(path和name不能同时使用)
    name: /usr/log/example.log
    # 日志大小
    max-size: 1MB
    # 历史日志备份文件时间(天)
    max-history: 7
  pattern:
    # 配置控制台日志输出格式(时间+级别+线程+包名+方法+行数+输出信息)
    console: '%d %-5level [%thread] %logger:%method:%line %msg %n'
    # 配置文件日志输出格式
    file: '%d %-5level [%thread] %logger:%method:%line %msg %n'

使用

方式1:lombok

@Slf4j

log.info("log finish id : ", id);


方式2:自己声明

private static final Logger log = LoggerFactory.getLogger(TestController.class);

log.info("log finish id : ", id);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值