1.springboot是什么? 有什么用?
1.1 是什么
一个整合常用第三方框架,简化xml配置,完全采用注解形式,内置tomcat容器,帮助开发者快速实现项目搭建,spring boot 的web组件默认集成的是springMVC框架
注意:spring boot 是一个开发框架 并不是微服务
1.2 作用
(1)、简化项目搭建难度
(2) 、简化jar配置
(3)、大大减少xml 配置
(4)、内容tomcat容器,开发者无需配置,且端口修改特别容易
2.开发环境要求
工具(建议):idea
jdk: Java1.8及以上
spring版本:Spring Framework 4.1.5及以上
本文采用 Spring Boot 2.1.4 版本调试通过。
3. spring boot与springMVC 及 spring boot与spring cloud的区别
3.1 spring boot 与springMVC
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC只是控制层框架。
3.2 spring boot 与spring cloud
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringCloud依赖与SpringBoot组件,使用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务解决框架。
4.spring boot入门案例
4.1 下载配置 idea 环境
4.2 springboot入门demo
创建的项目 初始化样式:
编写功能类
这里只是controller层
效果:
相关代码:
主函数:
package cn.ma.spring_demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;//发现@SpringBootApplication是一个复合注解,// 包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。//该注解扫面的是该类所在包下面的所有内容 就是 @ComponentScan("cn.ma.spring_demo")@SpringBootApplication//所以 如何要访问的类包路径高于启动类的包路径是无法被访问到的public class SpringDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringDemoApplication.class, args); }} |
相关方法:
/** * 公司: * 文件名:SpringDemoController * 作者: 18392 * 时间: 2019/4/24 0:07 * 描述: */package cn.ma.spring_demo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController//只能返回字符串 @RestController = @RespnoseBody+ @Controllerpublic class SpringDemoController { /* *1.spring boot 入门案例 * http://localhost:8080/springDemoFunction * @Author sunshine * @Description //TODO * @Date 0:11 2019/4/24 * @Param [] * @return java.lang.String **/ @RequestMapping("/springDemoFunction") public String springDemoFunction(){ return "我是spring boot 入门demo"; }}
pom中的相关配置
4.0.0 cn.ma spring_demo 0.0.1-SNAPSHOT spring_demo Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test 1.8 org.springframework.boot spring-boot-maven-plugin
5.springboot中常用注解
(1) @RestController
在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写Restful接口列如下图:
(2)@EnableAutoConfiguration
作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。(3) @SpringBootConfiguration
继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
(4) @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理。
(5) @SpringBootApplication
@SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
也就是说我们可以用后3个来代替 @SpringBootApplication
如下图:
6. web端开发
6.1 静态资源访问
访问效果图:
6.2 整合web视图
6.2.1 整合freemaker
第一步:
在src/main/resources/创建一个templates文件夹,后缀为*.ftl
第二步:引入freeMarker的依赖包
|
第三步:编写后台方法
第四步:编写ftl页面
6.2.2 springboot整合jsp
第1步:springboot的pom中引入jsp相关jar
org.springframework.boot spring-boot-starter-tomcat org.apache.tomcat.embed tomcat-embed-jasper javax.servlet jstl
第2步:配置前端位置
spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp
第三步:创建静态文件防止路径 看准路径
第四步:后台编写及jsp页面
效果:
7.配置全局捕获异常
7.1 自定义异常类
/** * 公司:马氏集团 * 文件名:GlobalExceptionHandler * 作者: 18392 * 时间: 2019/4/26 10:29 * 描述: */package cn.ma.spring_demo.err;import com.alibaba.fastjson.JSONObject;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(RuntimeException.class) @RequestMapping("/exceptionHandler") public void exceptionHandler(HttpServletResponse response) throws IOException { //解决乱码 及跨域 response.setContentType("text/html; charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域 HashMapmap = new HashMap<>(); map.put("msg","系统异常!"); String msg = JSONObject.toJSONString(map); PrintWriter out = response.getWriter(); out.println(msg); out.flush(); out.close(); }}
效果:
8.处理日志(思想很重要 AOP)
方式有:3种
方式一:log4j
方式二:
方式三:lombok插件 打印 放在一级标题 9了(原因很好用)
8.1 log4j打印日志
(1)引入相关jar
(2) 定义全局变量
//log4j打印日志private static final Logger logger = LoggerFactory.getLogger(SpringDemoController.class);
(3) 通过log4j打印
8.2
(1)导入aop相关jar
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> |
(2) 日志工具类(记得该切点路径)
/** * 公司: * 文件名:HttpAspect * 作者: 18392 * 时间: 2019/4/26 11:45 * 描述: */package cn.ma.spring_demo.utils;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.util.Date;import java.util.Enumeration;/** 作用:获取用户请求* (1)访问地址URL* (2) 请求方式* (3) 请求者IP* (4) 请求方法的响应时长 * @Author sunshine * @Description //TODO * @Date 13:11 2019/4/26 * @Param * @return **/@Aspect@Componentpublic class HttpAspect { private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class); //切点 @Pointcut("execution(public * cn.ma.spring_demo.controller.*.*(..))") public void webLog() { } // System.out.println();// new Date()为获取当前系统时间 long beginTime=0;//开始时间 long endTime=0;//结束时间 //前置通知 @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Exception { //没抽取的原因是并发的时候会导致问题 这样安全性更高 Date d = new Date(); long time = d.getTime(); beginTime =time; // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("访问地址URL : " + request.getRequestURL().toString()); logger.info("请求方式HTTP_METHOD : " + request.getMethod()); logger.info("访问者IP : " + request.getRemoteAddr()); Enumeration |
效果:
9.Spring Boot集成lombok让代码更简洁
这个插件特别好用 所以用一级标题 编写
功能:简化getXxx/setXxx方法 可以打印日志
在idea上安装教程:
https://www.cnblogs.com/hackyo/p/7998485.html
9.1 简化getXxx/setXxx方法
效果:
使用教程:
(1) 引入插件
(2) 实体类上添加注解
@Slf4j@Data
测试:
9.2 插件的其他注解
@Data 标签,生成getter/setter toString()等方法
@NonNull : 让你不在担忧并且爱上NullPointerException
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法
@Setter/@Getter : 自动生成set和get方法
@ToString : 自动生成toString方法
@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
自动生成构造方法
@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
@Value : 用于注解final类
@Builder : 产生复杂的构建器api类
@SneakyThrows : 异常处理(谨慎使用)
@Synchronized : 同步方法安全的转化
@Getter(lazy=true) :
@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4
10. springboot整合 mybaties
1. 搭建springboot项目
(2)pom中配置jar
非常重要:
(3) 配置数据源
spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springbootspring.datasource.username=rootspring.datasource.password=root
(4) 创建3层包
(5) 三层代码
5.1 controller层
5.2 业务层
业务层接口:
业务层实现类:
持久岑:
持久岑接口:
持久岑xml文件:
注意 配置扫包:
项目搭建好后的测试:
代码:
码云:
百度云:
链接:https://pan.baidu.com/s/1oPJ2ms9t-6yY27HPxB11TA
提取码:2ovl11.springboot定时任务
只需要web的相关jar 不需要添加任何其他的jar
@EnableScheduling//开启spring定时任务
// http://cron.qqe2.com///@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行public void reportCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); System.out.println("现在时间:" + dateFormat.format(new Date()));}
11.问题整理
11.1 端口被占用
11.2 乱码 及跨域 (重复代码 使用AOP解决)
//解决乱码 及跨域response.setContentType("text/html; charset=utf-8");response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域
11.3 通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO
解决方案代码:
#2.统一配置实体类包路径mybatis.type-aliases-package=cn.guang.springboot_mybites.domain
错误效果:
配置位置:
11.4 开始驼峰式命名
#3.开启驼峰命名mybatis.configuration.map-underscore-to-camel-case=true
问题效果:
开始后的效果:
11.5 xml静态资源 扫包 及放行
扫包:
@MapperScan("cn.guang.springboot_mybites.mapper")//扫描xml文件路径
xml 资源放行:(注意代码 编写的位置)
src/main/java **/*.xml true
12. springboot定时任务
@EnableScheduling//开启spring定时任务
// http://cron.qqe2.com///@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行public void reportCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); System.out.println("现在时间:" + dateFormat.format(new Date()));}
13.springboot拦截器配置
效果:
13.1 自定义拦截器类
/** * 公司:马氏集团 * 文件名:LoginIntercept * 作者: 18392 * 时间: 2019/4/28 22:35 * 描述: */package cn.guang.boottime.utils;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /* * 自定义拦截器类 * 放行注册 验证码 登录等方法 * @Author sunshine * @Description //TODO * @Date 22:49 2019/4/28 * @Param * @return **/@Componentpublic class LoginIntercept implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //解决乱码 及跨域 response.setContentType("text/html; charset=utf-8"); response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域 //自己进行改造 到时候 判断session区域中是否存在用户 存在放行 否则到登录页面 System.out.println("开始拦截"); String token = request.getParameter("token"); if (StringUtils.isEmpty(token)) { response.getWriter().println("请先登录");//实际上要跳转页面的 return false; } return true; }}
13.2 配置启动 自定义拦截器类
/** * 公司:马氏集团 * 文件名:WebConfig * 作者: 18392 * 时间: 2019/4/27 22:27 * 描述: */package cn.guang.boottime.utils;import org.springframework.beans.factory.annotation.Autowired;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.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** 用于配置启动 自定义拦截器类 * @Author sunshine * @Description //TODO * @Date 22:57 2019/4/28 * @Param * @return **/@Configurationpublic class WebConfig implements WebMvcConfigurer { @Autowired private LoginIntercept loginIntercept;//自己定义的 // 这个方法是用来配置静态资源的,比如html,js,css,等等 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效 @Override public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns("/**") 表示拦截所有的请求, // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问 registry.addInterceptor(loginIntercept).addPathPatterns("/**").excludePathPatterns("/login", "/register"); }}
13.3 改造为登录 代码
效果:
未登录前:
登录成功 可以访问其他方法
代码编写:
(1) 配置数据源
(2) 新建 实体类
(3) 三层代码编写 controller层简单处理一下业务
附上代码
码云:
百度云:
链接:https://pan.baidu.com/s/1aoZAlIlr9bBVwguJ_hVGPg
提取码:saex14. 配置静态资源变量
//注入配置变量@Value("${ip}")private String ip;
效果:
开发步骤:
(1) 配置文件中定义变量
(2) 子需要的类中注入变量对象
(3) 需要的地方调用
15.springboot 事务配置及应用
效果:
很简单 只要在需要事务的方法上加上事务注解即可
@Transactional//开启事务注解
16. 使用热部署插件 devtools
参考:
效果:当后台代码改变的时候 该插件帮助我们自动重启服务
配置步骤:
(1) 添加相关jar
org.springframework.boot spring-boot-devtools true true
true
(2) 设置里面加上自动编译
效果: