A.SpringBoot快速入门以及简介
1.为什么需要使用SpringBoot框架
SSM框架 Spring + SpringMVC + Mybatis,通过XML方式配置
SpringBoot快速开发框架,能够帮助我们程序员快速整合第三方框架
能够帮助我们程序员快速整合第三方框架原理:封装Maven依赖方式实现
SpringBoot特性:
- 去除XML配置
- 全部采用注解化的方式配置
- 内嵌入Tomcat
- 能够帮助程序员快速开发
- SpringBoot框架默认的情况下spring-boot-starter-web已经帮助我们整合好SpringMVC框架
2.SpringBoot和SpringCloud的区别
- SpringCloud是微服务解决框架,提供微服务技术解决方案。
- SpringCloud RPC远程调用接口 feign客户端
- 接口的协议采用Http协议
- SpringCloud依赖于SpringBoot默认的情况下已经整合好SpringMVC,所以SpringCloud可以使用SpringMVC编写接口
补充:建包的区别
eg:com.dsa.controller和com.dsa.service
com.dsa.controller:含有视图层(web)和接口(业务逻辑)
com.dsa.service:只含有接口
3.SpringBoot依赖引入介绍
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE </version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter-parent作用:
在pom.xml中引入spring-boot-start-parent,spring官方的解释叫什么stater poms,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了,后面可以看到。
spring-boot-starter-web作用:
引入很多Spring系列的依赖,包括内嵌Tomcat的依赖
springweb 核心组件
4.RestController注解(和Controller注解作比较)
@RestController:
- 如果在类上加上@RestController,该类中所有SpringMVCUrl接口映射都是返回JSON格式
- 相当于在每个方法上加上@ResponseBody注解,返回JSON格式
- @RestController是我们SpirngMVC提供的,而不是SpringBoot提供的
- Rest,微服务接口开发中Rest风格,数据传输格式json格式,协议为Http协议
@Controller:
5.SpringBoot启动方式(有三种方式)
启动方式一:1.@EnableAutoConfiguration 注解 + SpringApplication.run(HelloController.class,args)
@EnableAutoConfiguration注解:
作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
@RestController
@EnableAutoConfiguration
public class HelloController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(HelloController.class, args);
}
}
启动方式二:@ComponentScan(basePackages = “com.dsa.controller”)—控制器扫包范围
@ComponentScan(basePackages = "com.dsa.controller")
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
启动方式三:@SpringBootApplication
@SpringBootApplication 被 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 注解所组合,换言之 Springboot 提供了统一的注解来替代以上三个注解
扫包范围:在启动类上加上@SpringBootApplication注解,当前包下或者子包下所有的类都可以扫到。(同一个包下的类或者是子包下的类都会被扫描到)
6.SpringBoot简介
回顾什么是Spring
Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者:Rod Johnson 。
Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程,所有东西都是bean;
2、通过IOC,依赖注入(DI)和面向接口实现松耦合;
3、基于切面(AOP)和惯例进行声明式编程;
4、通过切面和模版减少样式代码,Redistemplate,xxxTemplate;
什么是SpringBoot
学过javaweb的同学就知道,开发一个web应用,从最初开始接触Servlet结合Tomcat, 跑出一个Hello Wolrld程序,是要经历特别多的步骤;后来就用了框架Struts,再后来是SpringMVC,到了现在的SpringBoot,过一两年又会有其他web框架出现;你们有经历过框架不断的演进,然后自己开发项目所有的技术也在不断的变化、改造吗?建议都可以去经历一遍;
言归正传,什么是SpringBoot呢,就是一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置, you can “just run”,能迅速的开发web应用,几行代码开发一个http接口。
所有的技术框架的发展似乎都遵循了一条主线规律:从一个复杂应用场景 衍生 一种规范框架,人们只需要进行各种配置而不需要自己去实现它,这时候强大的配置功能成了优点;发展到一定程度之后,人们根据实际生产应用情况,选取其中实用功能和设计精华,重构出一些轻量级的框架;之后为了提高开发效率,嫌弃原先的各类配置过于麻烦,于是开始提倡“约定大于配置”,进而衍生出一些一站式的解决方案。
是的这就是Java企业级应用->J2EE->spring->springboot的过程。
随着 Spring 不断的发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么易用简单,违背了最初的理念,甚至人称配置地狱。Spring Boot 正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用 Spring 、更容易的集成各种常用的中间件、开源软件;
Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。
简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架 。
Spring Boot 出生名门,从一开始就站在一个比较高的起点,又经过这几年的发展,生态足够完善,Spring Boot 已经当之无愧成为 Java 领域最热门的技术。
Spring Boot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
真的很爽,我们快速去体验开发个接口的感觉吧!
B.SpringBoot整合Web开发
1.SpringBoot整合静态资源访问
我们在开发Web应用的时候,需要引入大量的JS、CSS、图片等静态资源
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/meta-inf/resources
举例:我们可以在src/main/resources/目录下创建static,然后在static下放置一张图片文件,然后启动层序,尝试访问http://localhost:8080/D.jpg,如果能访问成功,则说明配置成功!(如果不在resources目录下创建static,然后把图片放在static下,则访问图片失败!)
微服务项目
前后端分离思想:
- 前端–vue–前端工程师(前端交给专业的人来做(前端工程师))
- 后端–SpringBoot–后端工程师(后端工程师负责写接口就可以了)
动静分离思想:
我们不可能将所有的静态资源都放在我们的项目上,应该部署在cdn上
cdn作用:减少带宽距离传输,减少自己服务器带宽。
2.yml与Properties格式的区别
读取本地配置文件可以使用@value注解
@Value("${CodePeng.name}")//配置文件里的CodePeng.name
private String name;
SpringBoot支持两种配置方式,一种是properties文件,一种是yml
使用yml可以减少配置文件的重复性
例如:application.properties
例如:application.yml
properties格式如下:
CodePeng.name = 机车
CodePeng.age = 99
yml格式如下:
CodePeng:
name: 机车//冒号后面有个空格(切记)没有空格的话IDEA会检测到配置文件有错误
age: 99//冒号后面有个空格(切记)没有空格的话IDEA会检测到配置文件有错误
3.模板引擎框架
前后端
渲染Web页面
在之前的示例中,我们都是通过@RestController来处理请求,所以返回的内容为json对象。那么如果需要渲染html页面的时候,要如何实现呢?
在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。
Spring Boot提供了默认配置的模板引擎主要有以下几种:
-
Thymeleaf
-
FreeMarker
-
VeLocity
-
Groovy
-
Mustache
Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。
4.使用Freemarker模板引擎渲染web视图
1.pom文件引入
<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
@Controller
public class freeMarkerController{
@RequestMapping("/freemarkerIndex")
public String freeMarkerIndex(Map<String,String> m){
//转发到页面数据name
m.put("name","freeMarkerIndex");
//mvc跳转页面freemarkerIndex.ftl
return "freemarkerIndex";
}
}
3.前台代码(在src/main/resources/创建一个templates文件夹,后缀为.ftl*)
<!DOCTYPE html>
<html>
<head lang="en">
<Meta charset="UTF-8" />
<title></title>
</head>
<body>
${name}
</body>
</html>
5.ftl模板引擎条件判断用法(SpringBoot整合FreeMarker配置)
1.新建application.yml文件
spring:
http:
encoding:
force: true
### 模版引擎编码为UTF-8
charset: UTF-8
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: UTF-8
content-type: text/html; charset=utf-8
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
## 模版文件结尾.ftl
suffix: .ftl
## 模版文件目录
template-loader-path: classpath:/templates
@RequestMapping("/freemarkerIndex")
public String index(Map<String, Object> result) {
result.put("name", "yushengjun");
result.put("sex", "0");
List<String> listResult = new ArrayList<String>();
listResult.add("zhangsan");
listResult.add("lisi");
listResult.add("mayikt");
result.put("listResult", listResult);
return "index";
}
<!DOCTYPE html>
<html>
<head lang="en">
<Meta charset="UTF-8" />
<title>首页</title>
</head>
<body>
${name}
<#if sex=="1">
男
<#elseif sex=="2">
女
<#else>
其他
</#if>
<#list userlist as user>
${user}
</#list>
</body>
</html>
两种方法
1 用符号代替: > gt , >= gte ,< lt , <= lte
2 加括号 <#if(x>y)>
6.使用thymeleaf渲染Web页面
1.什么是thymeleaf
thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似JSP,VeLocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。
2.导入thymeleaf依赖
<!--引入thymeleaf的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
3.新建application.yml文件(SpringBoot整合thymeleaf)
###ThymeLeaf配置
spring:
thymeleaf:
#prefix:指定模板所在的目录
prefix: classpath:/templates/
#check-tempate-location: 检查模板路径是否存在
check-template-location: true
#cache: 是否缓存,开发模式下设置为false,避免改了模板还要重启服务器,线上设置为true,可以提高性能。
cache: true
suffix: .html
encoding: UTF-8
mode: HTML5
import com.mayikt.entity.UserEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
public class IndexController {
@RequestMapping("/myThymeleaf")
public String myThymeleaf(Map<String, Object> result) {
result.put("user", new UserEntity("mayikt", 22));
return "myThymeleaf";
}
}
5.实体类
public class UserEntity {
private String userName;
private Integer age;
public UserEntity(String userName, Integer age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public Integer getAge() {
return age;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(Integer age) {
this.age = age;
}
}
<!DOCTYPE html>
<!--需要在HTML文件中加入以下语句: -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<Meta charset="UTF-8">
<title>Show User</title>
</head>
<body>
<table>
姓名:<span th:text="${user.userName}"></span>
年龄:<span th:text="${user.age}"></span>
</table>
</body>
</html>
C.数据库访问
1.SpringBoot整合使用JdbcTemplate
1.pom文件引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>MysqL</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
2.application.yml新增配置
datasource:
url: jdbc:MysqL://localhost:3306/test
username: root
password: root
driver-class-name: com.MysqL.jdbc.Driver
3.UserService类
@RestController
public class UserService(){
@AutoWired
private jdbcTemplate jdbcTemplate;
//插入数据到User表中
@RequestMpping("/insertUser")
public String insertUser(String userName,Integer age){
int update = jdbcTemplate.update("insert into user values(null,?,?),userName,age");
return update>0?"success":"fail";
}
}
4.启动类
@SpringBootApplication
public class App(){
public static void main(String[] args){
SpringApplication.run(App.class);
}
}
5.数据库表结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL COMMENT '用户名称',
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.SpringBoot整合Mybatis
1.pom文件引入
<!-- springboot 整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
2.application.yml引入
datasource:
url: jdbc:MysqL://localhost:3306/test
username: root
password: root
driver-class-name: com.MysqL.jdbc.Driver
3.Mapper代码(先创建一个Mapper包,里面放Mapper代码)
public interface UserMapper {
@Select("SELECT * FROM USERS WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);
}
4.实体类
public class UserEntity {
private String userName;
private Integer age;
public UserEntity(String userName, Integer age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public Integer getAge() {
return age;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(Integer age) {
this.age = age;
}
}
5.启动方式(@MapperScan注解)
@SpringBootApplication
@MapperScan("com.mayikt.mapper")
public class AppMybatis {
public static void main(String[] args) {
SpringApplication.run(AppMybatis.class);
}
}
//Mybatis查询
@RequestMpping("/mybatisFindById")
public userEntity mybatisFindById(Integer id){
return userMapping.selectByUserId(Id);
}
D.整合热部署框架
1.整合devtools框架
1.什么是热部署?
原理:类加载器
适合于本地开发
2.导入Maven依赖(devtools依赖)
<!--SpringBoot热部署配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
3.Idea工具设置(热部署设置)
(1)“File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project automatically” 。
(2) 组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running”
(3)idea配置完成后,然后按住保存键,保存完后自动实现重启
2.SpringBoot集成lombok插件
1.需要在idea中安装lombok插件
3.安装完lombok插件后点击重启idea即可
4.整合lombok插件的注意事件
5.lombok原理
实际上在开发写代码的时候是不需要写get和set方法的,但是在编译class文件的时候,它会自动帮你生成get和set方法的,然后放入到class文件中
6.添加lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
7.实体类展示
@Slf4j
@Data
public class UserEntity {
// @Getter
// @Setter
private String userName;
// @Getter
// @Setter
private Integer age;
@Override
public String toString() {
return "UserEntity [userName=" + userName + ", age=" + age + "]";
}
public static void main(String[] args) {
UserEntity userEntity = new UserEntity();
userEntity.setUserName("zhangsan");
userEntity.setAge(20);
System.out.println(userEntity.toString());
log.info("####我是日志##########");
}
}
8.其他特性
@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
9.打印日志(直接在类上加上@Slf4j)
private static Logger log = Logger.getLogger(App.class);
直接在类上加上@Slf4j