Spring Boot
核心功能
- 自动配置
- 起步依赖
- Actoator
- 命令行界面
创建一个SpringBoot项目
-
New Project ,选择Spring Initializr,进入下一步。
-
填写相关信息,Group(组名称),Artifact(依赖名称),Package(SpringBoot启动类所在文件夹)。
-
选择开发工具,这里我选择Web > Spring Web。
-
填写项目名称和项目所在路径。
-
分配资源文件夹并初始化pom.xml(Add as maven project)。
SpringBoot的多环境配置
SringBoot的配置文件类型
- application.properties
- application.yml/yaml
如果同时存在以上两种配置文件,默认以application.properties为准。
SpringBoot的开发环境有哪些
- 开发环境 application-dev.yml
- 测试环境 application-test.yml
- 准生产环境 application-ready.yml
- 生产环境 aplication-prod.yml
如何切换开发环境
在application.yml中,切换spring: profiles: active: 的值即可。
spring:
profiles:
active: dev
例: 见上
SpringBoot获取配置文件中的值
使用@Value注解获取
假如在配置文件中,有这样一段配置:
user:
realName: LiMing
age: 18
那么我们该如何获取‘name’的值呢?
@Value("${user.realName}")
private String realName;
打印如下:
将自定义配置映射到对象
user:
realName: WangLin
age: 20
- 首先自定义User类,有两个属性realName、age,并且创建Setter和Getter。
- 将User类放入Spring容器中(@Component)。
- 添加注解@ConfigurationProperties(prefix = “user”)。
- 注入对象,获取属性,打印如下:
mybatis逆向工程
什么是mybatis逆向工程?
简而言之,mybatis逆向工程就是通过数据表,生成对应的实体类和持久层。
如何使用mybatis逆向工程?
- 首先,导入 jdbc 和 mbatis与spring Boot 集成的依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
- 创建逆向工程相关的xml,GeneratorMapper.xml。
百度网盘地址:https://pan.baidu.com/s/17Y-03sURjhz85nrjzK97Cw
提取码:jh4d
- 修改Jdbc相关jar包的路径和数据库链接信息。
- 在pom.xml中添加插件
<!--mybatis代码自动生成插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
- 测试
此时访问,会报如下异常
- 这是因为没有将xml文件编译
- 添加xml文件为资源文件,在pom.xml中添加如下代码,手动添加资源文件夹。
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
Mapper的存放位置
代码文件夹下
从上篇博文中我们知道,Mapper可以存放在java的子包下,这时我们可以通过添加mapper文件夹为资源文件夹的做法来编译mapper映射文件
类路径下
所谓的类路径,就是resources文件夹,此时我们可以在配置文件中设置映射文件的路径
mybatis:
mapper-locations: classpath:mapper/*.xml
前提是:需要导入mybatis继承springBoot的依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
SpringBoot支持事务
Spring Boot是如何支持事务的?
事务经常被使用在“业务层”,在需要事务的方法或类上添加 @Transactional 注解
Resful相关注解
注解名称 | 使用位置 | 作用 |
---|---|---|
@RestController | 控制层类上 | 该类的所有方法返回的均是JSON对象 ,相当于@Controller + @ResponseBody |
@GetMapper | 控制层方法上 | 该方法只能通过"Get"请求方式访问,经常用于获取对象信息,相当于@RequestMapper(Value = “xxx”, method = Request.GET) |
@PostMapper | 控制层方法上 | 该方法只能通过"Post"请求方式访问,经常用于添加对象 |
@DeleteMapper | 控制层方法上 | 该方法只能通过"Delete"请求方式访问,经常用于删除对象 |
@PutMapper | 控制层方法上 | 该方法只能通过"Put"请求方式访问,经常用于更新对象信息 |
@PathVariable | 参数上 | 获取路径中对应的参数,例@PathVariable(“id”) Integet id |
SpringBoot整合Redis
- 导入SpringBoot整合redis的坐标
<!--SpringBoot集成redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 导入相关配置
spring:
redis:
host: localhost
port: 6379
- 在service层注入RedisTemplate<Object, Object>。
- 使用redisTemplate.opsForValue().set(key, value)设置String类型的数据,同理,使用get(key)获取数据。
SpringBoot使用拦截器
1.自定义拦截器
- 自定义UserInterceptor类实现HandlerInterceptor,重写preHandle()、postHandle()以及afterCompletion()。
- 假设我们需要判断用户是否登录。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器开始--------");
// 判断用户是否登录
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/user/error");
return false;
}
return true;
}
2.注册拦截器到拦截器的配置类
- 定义InterceptorConfig,添加注解@Configuration,将该类作为配置类。并且实现WebMvcConfigurer。
- 重写addInterceptors()方法,将自定义的拦截器注册到配置类中。
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] pathPatterns = {"/user/**"};
String[] excludePathPatterns = {"/user/login", "/user/other", "/user/error"};
// mvc:Interceptor bean class= ""
registry.addInterceptor(new UserInterceptor()).addPathPatterns(pathPatterns).excludePathPatterns(excludePathPatterns);
}
SpringBoot使用Servlet
1.Servlet的注解扫描
- 自定义MyServlet继承HttpServlet,并重写doGet()和doPost()。
- 在MyServlet上添加注解WebServlet(“xxx”)。
- 在SpringBoot的启动类上添加Servlet组件扫描@ServletComponentScan。
2.将Servlet注册到配置类中
- 自定义MyServlet继承HttpServlet,并重写doGet()和doPost()。
- 自定义配置类ServletConfig,并将其作为配置类(@Configuration)。
- 自定义一个返回值为ServletRegistrationBean的方法,将Servlet注册进配置类中。
4.添加@Bean注解。
@Bean
public ServletRegistrationBean getServletRegistrationBean() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(), "/myServlet2");
return servletRegistrationBean;
}
SpringBoot使用Filter
1.注解
- 自定义MyFilter实现Filter,并重写doFilter()。
- 在MyFilter上添加注解WebFilter(urlPattern = “xxx”),这里的urlPattern指的是拦截路径。
- 在SpringBoot的启动类上添加Servlet组件扫描@ServletComponentScan。
2.将Filter注册到配置类中
- 自定义MyFilter实现Filter,并重写doFilter()。
- 自定义配置类FilterConfig,并将其作为配置类(@Configuration)。
- 自定义一个返回值为FilterRegistrationBean的方法,将Servlet注册进配置类中。
4.添加@Bean注解。
@Bean
public FilterRegistrationBean myFilterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
filterRegistrationBean.addUrlPatterns("/user/*");
return filterRegistrationBean;
}
设置字符编码
创建字符编码配置类
- 创建Servlet,添加中文到响应消息中。
- 在Springboot的启动类添加Servlet组件扫描@ServletComponentScan。
- 创建配置类,添加一个返回值为FilterRegistrationBean的方法,具体细节如下
@Bean
public FilterRegistrationBean filterRegistrationBean() {
// 创建字符编码过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter("UTF-8", true);
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
// 设置字符编码过滤器
filterRegistrationBean.setFilter(characterEncodingFilter);
// 设置字符编码过滤器路径
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
- 关闭SpringBoot的http字符编码支持,Spring字符编码过滤器才会生效。
#关闭SpringBoot的http字符编码支持,Spring字符编码过滤器才会生效
server:
servlet:
encoding:
enabled: false
修改核心配置文件
- 创建Servlet,添加中文到响应消息中。
- 在Springboot的启动类添加Servlet组件扫描@ServletComponentScan。
- 设置请求相应字符编码
#设置请求相应字符编码
server:
servlet:
encoding:
enabled: true
force: true
charset: utf-8
springBoot打war包、jar包
war包
- 创建springboot工程,添加sprboot内嵌tomcat的依赖,指定其打包方式为war。
<packaging>war</packaging>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- 添加控制层,其中有一个映射可以跳转到jsp页面。
@RequestMapping("/user/pageDetail")
public ModelAndView pageDetail() {
ModelAndView modelAndView = new ModelAndView("userDetail");
modelAndView.addObject("id", 1001);
modelAndView.addObject("username", "XiaoMing");
return modelAndView;
}
-
添加webapp资源文件夹。
-
创建userDetail.jsp,获取参数id和username。
-
配置视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
- 修改资源文件夹。
<!--指定打war包的字符-->
<finalName>springBoot</finalName>
<!--指定编译的位置-->
<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
- 启动类继承SpringBootServletInitializer类,并重写其configure方法。
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 重新打包资源
return builder.sources(Application.class);
}
jar包
- 创建springboot工程,添加sprboot内嵌tomcat的依赖。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- 添加控制层,其中有一个映射可以跳转到jsp页面。
@RequestMapping("/user/pageDetail")
public ModelAndView pageDetail() {
ModelAndView modelAndView = new ModelAndView("userDetail");
modelAndView.addObject("id", 1001);
modelAndView.addObject("username", "XiaoMing");
return modelAndView;
}
-
添加webapp资源文件夹。
-
创建userDetail.jsp,获取参数id和username。
-
配置视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
- 修改资源文件夹。
<!--指定打war包的字符-->
<finalName>springBoot</finalName>
<!--指定编译的位置-->
<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
- 指定打jar包插件的版本。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
</plugin>
logback基础配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别从低到高 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为
WARN,则低于WARN的信息都不会输出-->
<!--scan: 当此属性为true时,配置文件如果发生变化,将会被重新加载,默认值为true-->
<!--scanPeriod: 设置检测配置文件是否有修改的时间间隙,如果没有给出时间单位,默认时
毫秒。当scan为true时,此属性生效,默认的时间间隔为1分钟。-->
<!--debug: 当此属性为true时,将打印出logback内部日志文件,实时查看logback运行状态。
默认值为false,通常不打印
-->
<configuration scan="true" scanPeriod="10 seconds">
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--定义最低打印级别-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<Pattern>%date [%5p] [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到控制台-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>D:/log/stdout.log</File>
<encoder>
<Pattern>%date [%-5p] [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!--默认为DEBUG-->
<logger name="com.gangwantech.mapper" level="TRACE"/>
<root level="WARN">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>