快速搭建SpringBoot项目以及相关整合技术(附源码)
1、SpringBoot介绍
将之前常用的spring,springmvc,data-jpa等常用框架封装到一起,帮助你隐藏这些框架的整合细节,实现敏捷开发
1.1、特点
- 不需要模板化的配置 ,将会带来全新的轻便体验;
- SpringBoot整合第三方框架时,只需 导入相应的starter依赖包就自动整合了;
- SpringBoot默认只有 一个.properties或yml结尾的配置文件 ,且不推荐使用xml文件,后期采用.java文件(用到@Configuration注解的类))去编写配置信息;
- SpringBoot工程在部署时,采用的是jar包的方式,内部自动依赖Tomcat容器,提供了多环境的配置 ;
- 且后期要学习的微服务框架SpringCloud需要建立在SpringBoot基础上;
1.2、工程的目录结构
- src
- main
- java
- 包名
- 启动类 (启动类.java,将Controller和其他包放在此包的子包或者同级包下)
- 其他包
- 包名
- java
- main
- resources
- static(放静态资源,如图片,视频)
- templates(存放页面模板jsp,thymeleaf等)
- application.properties(唯一的配置文件)
1.3、三种启动方式
- 运行启动类main方法
- 采用maven命令:mvn spring-boot:run
- 采用jar包方式运行:将项目打包成jar文件,通过 java -jar jar文件名
1.4、常用注解
1.4.1 @Configuration和@Bean(编写配置类)
- 之前Spring在xml文件中编写大量bean标签,SpringBoot不推荐使用xml
- @Configuration相当于beans标签
- @Bean相当于bean标签
1.4.2 @SpringBootApplication(一个组合注解)
- @SpringBootConfiguration:就是@Configuration注解
- @EnableAutoConfiguration:实现自动装配
- @ComponentScan:帮助扫描注解的
1.4.3 @value和ConfigurationProperties(引入外部配置文件信息)
- @value:是获取.properties或yml内容,如@value($(“key”))
- @ConfigurationProperties:是在yml中有大量自定义配置,且有统一前缀,和@Component(组件注解)一起写在实体类中,注:@ConfigurationProperties(prefix=“前缀”),前缀是必填的
1.4.4 @MapperScan(basepackage=“”),@Service,@Controller和@transaction
- @Mapper是dao层的注解,但dao太多,就用@MapperScan(basepackage=“mapper包”),此注解用在启动类中
- @Service:声明是一个Service
- @Controller:声明是一个Controller
- @transaction:开启事务注解,开启后具有回滚和提交,但值都是SpringBoot默认的
1.4.5 @RequestMapping,@PostMapping,@GetMapping和@PathVariable(Rest风格的Controller常用注解)
- @RequestMapping,@PostMapping,@GetMapping:均是编写接口路径,@RequestMapping在Post和Get请求都能用
- @PathVariable:实现rest风格必备注解,如@RequestMapping(value=“/student/{id}”)在方法参数中得加上@PathVariable(“id”)注解
1.5、多环境配置
- SpringBoot只有一个配置文件,推荐使用.yml。
- .yml文件优点:根据换行和缩进帮助管理配置文件位置,相比更轻量级
- yml文件缺点:严格遵循换行和缩进,填写value,且一定要在:后面跟空格
- 多环境配置:在application.yml中添加一个配置项
-
spring:
- profiles:
- active:环境名
在resource目录下,即可创建多个application-环境名.yml文件
且在部署工程时,通过java -jar jar文件 – spring.profiles.active=环境名 - profiles:
2、SpringBoot整合各类框架
2.1、整合Mybatis框架
- 导入依赖(3个)
//导入mysql驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
//导入Mybatis整合SpringBoot的起步依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
//导入druid连接池依赖
<dependency>
<groupId>aliyun.druid</groupId>
<artifactId>druid</artifactId>
</dependency>
- 编写Mapper接口和映射文件
//编写mapper接口
@Mapper
public interface StudentMapper(){
Student selectAll();
int deleteById(Integer id);
}
- 编写配置文件(.yml为例)
//设置连接数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/student
username: root
password: 123
//设置mybatis配置,扫描映射文件和别名扫描包以及驼峰映射
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.hq.Entity
configuration: map-underscore-to-camel-case:true
2.2、整合JSP,分页助手
- 导入依赖
//导入SpringBoot对jsp的解析依赖,还有jstl等
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
------------------------------------------------------------------
//导入分页助手依赖,在Service就能直接用了PageHelper和PageInfo
<dependency>
<groupId>PageHelper</groupId>
<artifactId>PageHelper-spring-boot-starter</artifactId>
</dependency>
- 创建Webapp以及WEB-INF存放jsp页面
- 像tomcat创建web页面一样
- 在yml文件指定view的前后缀
//配置视图解析器
spring:
mvc:
view:
prefix: /
suffix: .jsp
- 还必须在pom手动指定规定路径META-INF/resource
//SpringBoot推荐使用Thymeleaf,如果要使用其他模板引擎,则要指定编译路径
<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targerPath>
<includes>
<include>*.*</include>
</includes>
</resource>
</resources>
2.3、整合redis框架
- 导入依赖
//SpringBoot集成redis起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 在yml文件中配置相关信息
//配置连接redis相关配置
spring:
redis:
host: 192.168.001
port: 6379
password: 123
- 在Service用RedisTemplate
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private RedisTemplate<object,object> redisTemplate;
//编写redis的put方法
@Override
public void put(String key,String value){
redisTemplate.opsForValue().set(key,value);
}
//编写redis的get方法
@Override
public String get(String key){
String count=(String)redisTemplate.opsForValue().get(key);
return count;
}
}
2.4、整合Thymeleaf模板引擎
带你走进比走进jsp还爽的模板引擎,简单又便于SpringBoot开发,还自动集成。冲冲冲
2.4.1、初识Thymeleaf模板引擎
什么是Thymeleaf?
- 官网解释是:Thymeleaf是适用于独立Web和独立环境的现代服务器端java模板引擎
- 模板引擎是:为了使用户界面和业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。
- Thymeleaf相对于jsp,FreeMaker等模板引擎的优点:SpringBoot官方是默认支持Thymeleaf的,并且Thymeleaf是覆盖式,更适合动静分离,选用html作为模板页,不会破坏html结构。
2.4.2、MVC与Thymeleaf关系
我们使用的Thymeleaf模板引擎在整个web项目中起到视图展示(View)
- MVC全名叫做Model View Controller,是模型,视图,控制器缩写。
- Model(模型):表示应用程序核心,用来存储数据提供视图层渲染的。
- View(视图):显示数据,而SpringBoot默认就是用Thymeleaf作为视图的。
- Controller(控制器):处理输入请求,将模型和视图分离。
2.4.3 、如何简单使用Thymeleaf
简单开始使用Thymeleaf三步走:
- One:先导入依赖:Spring-boot-starter-thymeleaf
- Two:配置文件中,关闭缓存、修改前后缀(默认配好,但别忘记)。spring.thymeleaf.cache=false(关闭缓存)、spring.thymeleaf.prefix=classpath:|templates|、spring.thymeleaf.suffix=.html。
- Three:在html标签中导入头文件。<html xmlns:th=“http://www.thymeleaf.org”.>
完成上面三步即可开始编写Themeleaf的表达式了
2.4.4、Thymeleaf所有表达式和知识点
- 标准变量表达式(${}):
// 通用值
<span th:text="${user.id}">
- 选择变量表达式(*{}):
// 绑定一个对象值
<div th:object="${user}">
<span th:text="*{id}"></span>
</div>
- 路径表达式(@{}):
// 无参
<a th:href="@{/user/detail}"></a>
//有参(字符串拼接)
<a th:href="@{'/test?username='+${id}"></a>
//有参(format格式化)
<a th:href="@{/test(id=${id},username=${username})}"></a>
//rest风格用字符串
<a th:href="@{'/test/'+${id}}"></a>
- 循环遍历(th:each):
// list,map,数组
<div th:each="user,userStat:${userList}">
<span th:text="${user.id}"></span>
<span th:text="${userStat.index}"></span>
</div>
//user:当前循环的对象变量名称
//userStat:对象变量状态信息(不填写也默认有)
//userList:当前循环集合
- 条件判断(th:if):
// list,map,数组
//满足则执行
<div th:if="${sex eq 1}">
男
</div>
<div th:if="${sex eq 0}">
女
</div>
//switch,case也一样
- 内联表达式(th:inline):
//将数据和页面放一起
//内联文本
<div th:inline="text">
数据:[[${data}]]
</div>
//内联脚本
<script th:inline="javascipt">
function show(){
alert([[${data}]])
}
</script>
- 字符串拼接(|要拼接的内容|):
//优雅完成字符串拼接
<span th:text="|共${total}条${page}页,当前${now}页|"
- 基本表达式(${#…}):
//3种从session获值
<span th:text="${#Session.getAttribute('data')}"></span>
<span th:text="${#HttpSession.getAttribute('data')}"></span>
<span th:text="${Session.data}"></span>
- 功能表达式(${#}):
//时间格式化,字符串处理
<div th:text="${#dates.format(time,'yyyy-MM-dd')}"></div>
<div th:text="${#Strings.substring(data,0,10)}"></div>
<div th:text="${#Lists.一些集合方法}"></div>
2.5、整合RabbitMq组件框架(2021.9.1号前待更)
2.6、整合ElasticSearch组件框架(2021.9.1号前待更)
3、SpringBoot实现集成SpringMvc常用功能
3.1、集成实现拦截器
- 写实现类,实现HandlerInterceptor接口,重写里面方法
//设置拦截规则
public class UserInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(){
//编写业务拦截规则
System.out.printIn("进入拦截器");
User user=(User) request.getSession().getAttribute("user");
if(user==null){
response.sendRedirect("login.html");
return false;
}
return true;
}
}
- 定义一个类为拦截器的配置类实现WebMvcConfigurer接口
- 且重写addInterceptors方法设置拦截路径
//设置拦截路径
@Configuraton
public class InterceptorConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry){
String[] addPathPatterns={};
String[] excludePathPatterns={};
//添加拦截器的拦截路径和除外路径
registry.addInterceptor(new UserInterceptor())
.addPathPatterns(addPathPatterns)
.excludePathPatterns(excludePathPatterns)
}
}
3.2、集成实现过滤器和设置字符编码
3.2.1、过滤器
- 写实现类实现Filter接口,加@WebFilter编写过滤路径
//过滤器
@WebFilter(urlPatterns="/myfilter")
public class MyFilter implements Filter{
@Override
public void doFilter(){
System.Out.PrintIn("进入过滤器");
filterChain.doFilter(request,response);
}
- 再启动类上加@ServletComponentScan注解扫描过滤器
//启动类
@SpringBootApplication
@ServletComponentScan(basePackages="com.hq.springboot.filter")
public class Applicaton{
public static void main(String[] args){SpringAppliction.run}
}
3.2.2、设置字符编码
- 直接在yml文件中将1、编码开启 2、强制开启,3、格式为utf-8
//设置字符编码配置,SpringBoot就自动集成了
spring:
http:
encoding:
enabled: true
force: true
charset: utf-8
3.3、集成实现文件上传和下载
- 在配置类中用拦截器配置图片映射
//配置的图片映射
@Configuration
public class WebMVcConfig extends WebMvcConfigurerAdapter {
private static final String imgPath = "file:" + Constant.UPLOAD_PATH + Constant.IMG_FILE_NAME + "/";
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//将所有访问img/virtual/**的请求映射到文件上传的路径下 C:\Users\hq/upload/img(图片的保存路径)
registry.addResourceHandler("/img/virtual/**").addResourceLocations(imgPath);
super.addResourceHandlers(registry);
}
}
- 自定义常量
//常量
public class Constant {
//文件上传/图片 根目录
public static final String UPLOAD_PATH = System.getProperty("user.home") + "/upload/";
//图片目录
public static final String IMG_FILE_NAME = "img";
//图片相对路径
public static final String VIRTUAL_IMG_PATH = "img/virtual";
}
- 编写文件上传工具
public class FileUtil {
private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
// 图片存储 完整路径({user.home}/img/coldStone/XXX.jpg)
//@param file
// @return 返回相对路径
public static String saveImg(MultipartFile file) {
//获取文件上传的根目录 C:\Users\hq/upload/img
String path = Constant.UPLOAD_PATH + Constant.IMG_FILE_NAME;
//拿到文件的后缀名和UUID进行拼接形成新的文件名
//4ca64e85b1544c96b4a6154bb521476f.jpg
String saveName = CommonUtil.getUuid() + "." + getFileSuffix(file.getOriginalFilename());
logger.info(" --- 图片保存路径:{}, 图片保存名称:{} --- ", path, saveName);
// 保存
try {
// 保存文件图片
File targetFile = new File(path);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
file.transferTo(new File(path + "/" + saveName));
} catch (Exception e) {
e.printStackTrace();
logger.debug("--- 图片保存异常:{} ---" + e.getMessage());
return null;
}
String filePath = Constant.VIRTUAL_IMG_PATH;;
//返回相对路径 img/virtual/4ca64e85b1544c96b4a6154bb521476f.jpg
return filePath + "/" + saveName;
}
//返回截取的文件后缀
//@param path
//@return
private static String getFileSuffix(String path) {
return getFileSuffix(path, "2");
}
//获取文件名称或后缀(最后一个"."之后内容)
//@param path
//@param type 1名称 2后缀
//@return
private static String getFileSuffix(String path, String type){
if(StringUtils.isNotEmpty(path) && path.indexOf(".") > 0) {
// 名称
String name = path.substring(0, path.lastIndexOf("."));
// 后缀
String suffix = path.substring(path.lastIndexOf(".") + 1);
return StringUtils.equals("1", type) ? name : suffix;
} else {
return null;
}
}
}
- 在Controller层上实现测试
@RestController
@RequestMapping("/Userupload")
public class ImgUploadController {
@PostMapping(value = "/img/upload")
public String uploadImg(@RequestParam("image") MultipartFile img){
//图片上传调用工具类
try{
//保存图片
String path = FileUtil.saveImg(img);
return path;
}catch (Exception e){
return "上传图片失败";
}
}
}
3.4、集成logback日志(2021.9.1号前待更)
4、采用垂直架构在linux的部署与生产(2021.9.1号前待更)
4.1、Docker部署(2021.9.1号前待更)
4.2、使用nginx(2021.9.1号前待更)
4.3、打包在服务器上运行(2021.9.1号前待更)
链接: link.
// An highlighted block
var foo = 'bar';