课程目录
-
初始SpringBoot框架
-
SpringBoot快速搭建和入门
-
SpringBoot访问静态资源文件
-
SpringBoot全局异常处理
-
SpringBoot中YAML和Properties详解
-
SpringBoot中使用Freemarker
-
SpringBoot中使用Thymeleaf
-
SpringBoot整合SpringDataJPA
-
SpringBoot整合MyBatis(含Generator版本)
-
SpringBoot整合MongoDB
-
SpringBoot整合Redis
-
SpringBoot集成邮箱服务
-
SpringBoot之定时任务详解
一、为什么要使用SpringBoot
-
导入依赖必须要统一版本,因为太多了依赖了会版本会冲突(会依据大数据分享获取最新最稳定的版本 spring.io官网获取的)
-
配置太多了且每次都一样,大部分工程,配置每次都是一样的,从一个地方拷贝到另外一个地方.且Spring发展10多年,各种配置版本太多,对于很多程序员来说,分不清哪个是有效,哪个无效
-
部署太麻烦.需要tomcat部署,项目结构也需要照着Java EE的目录结构来写(以后tomcat用不到了)
二、什么是SpringBoot(重点面试题)
-
springboot是一个快速整合第三方的框架
-
底层是采用的maven继承的方式实现的(子项目能够继承父项目的pom文件)
-
springboot简化了Spring的应用开发,采用约定大于配置的理念
-
开箱即用,简化了xml的配置,完全注解化(没有xml文件了不会又bean标签@Bean)
-
内置有Http服务器(Netty和Tomcat),帮助开发者能够实现快速开发
-
SpringBoot的Web组件默认集成的是SpringMVC框架SpringMVC是控制层(简化web开发,学习0成本)
三、SpringBoot是如何发展出来的
-
这个要从Spring的发展史讲起
-
Spring 1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
-
Spring 2.x时代 随着DK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。 那么,问题来了,究竟是应该使用xml 还是注解呢? 最佳实践: -应用的基本配置用xml,比如:数据源、资源文件等 -业务开发用注解,比如: Service 中注入bean等
-
Spring 3.x时代 从Spring3.x开始提供了Javé配置方式,使用Java配置方式可以更好的理解你配置的 Bean,现在我们就处于这个时代,并且Spring4.x和Spring boot都推荐使用java配置的方式。
-
Spring 5.x时代 Spring5.x是Java 界首个支持响应式的 web框架,是Spring 的一个重要版本,距离Spring4.x差不多四年。在此期间,大多数增强都是在SpringBoot 项目中完成的,其最大的亮点就是提供了完整的端到端响应式编程的支持(新增spring webFlux模块)。
-
Spring webFlux同时支持使用旧的Spring MVC注解声明' Reactive Controller '。和传统的' MVC controller'不同,' Reactive Controller ' 操作的是非阻塞的 ' ServerHttpRequest ' 和 ' serverHttpResponse ',而不再是spring Mc 里的 HttpServletRequest 和HttpServletResponse。
-
至此也代表着Java 正式迎来了响应式异步编程的时代。
四、SpringBoot和SpringMVC的关系
-
SpringBoot的web组件默认集成的是springMVc框架。SpringMVc是控制层。
-
讲到springBoot,肯定有不少人会联想到springCloud(微服务)
五、SpringBoot和SpringCloud关系
-
SpringCloud和springBoot是依赖关系,SpringCloud不能独立存在,必须依赖于springBoot组件,使用SpringNVc编写Http协议接口,同时springBoot+SpringCloud才是一套完整的微服务解决框架。
-
springBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架
讲到SpringCloud,可能大家又会联想到另一个名词,它就是微服务
六、SpringBoot的优缺点
优点
快速构建项目
对主流开发框架的无配置集成
项目可独立运行,无需外部依赖Servlet容器
提供运行时的应用监控
极大地提高了开发、部署效率
与云计算的天然集成
缺点
-
版本迭代速度很快,一些模块改动很大
-
由于不用自己做配置,报错时很难定位
-
网上现成的解决方案比较少
七、系统要求
-
jdk1.8: Spring Boot2.0要求JDK必须是1.8及以上
-
maven3.5.4: Spring Boot2.0要求Maven必须3.5以上
-
IntelliJ IDEA2018.2:你们随便,我的反正是用的这个
-
SpringBoot 2.x.RELEASE: 2.x;
-
MySQL8.0.13:建议使用这个版本的MySQL
-
Spring Framework 5.x及以上
八、第一个SpringBoot项目的创建
1.创建一个Maven工程(youruike_springboot)----https://start.aliyun.com/
2.@SpringBootApplication核心注解
springboot的核心注解,复合注解,不是一个独立的注解,而是多个注解合在一起的
3.spingboot的注解
-
@SpringBootApplication: Spring BootM用仍工i未Rot日:置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;(读:A扑(pu)K显)
-
@SpringBootConfiguration :加载springboot的配置,配置类上来标注这个注解,配置类也是容器中的一个组件@Component (读:堪飞隔锐显)
-
@EnableAutoConfiguration :加载完之后执行自动配置(av薄a他咳飞kv显)
-
@ComponentScan :扫包(会扫描主配置类所在的包)
4.pom
-
. parent:继承了Spring Boot的 Parent,表示我们是一个 Spring Boot 工程
-
spring-boot-starter-web:包含了spring-boot-starter还自动帮我们开启了Web支持
5.功能演示
@RequestMapping("hello")
public String hello(){
//1.引入fastjson jackson
//2.springmvc
return "hello springboot";
}
6.神奇之处
-
没有配置 web.xml
-
没有配置application.xml,Spring Boot帮你配置了
-
没有配置application-mvc.xml,Spring Boot帮你配置了
-
没有配置Tomcat,Spring Boot内嵌了Tomcat 容器
7.springboot单元
@Autowired
private ApplicationContext ioc;
@Test
void getBean() {
String[] names = ioc.getBeanDefinitionNames();
for (String name:names
) {
System.out.println(name);
}
}
8.Spring Boot常用配置
spring-boot-starter-parent:Spring Boot的版本仲裁中心,以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖仍然需要声明版本号) spring-boot-starter-web:spring-boot场景启动器,帮我们导入了web模块正常运行所依赖的组件(不需要外置Tomcat,默认端口8080...); SpringBoot开发手册:Using Spring Boot
(1)自定义 Banner
我们在src/main/resources目录下新建一个banner.txt
通过Text to ASCII Art Generator (TAAG)
网站生成字符串,将网站生成的字符复制到banner.txt 中
再次运行这个程序
${AnsiColor.BLUE}
____ __ __ __ __
U /"___| \ \/"/ \ \ / /
\| | u /\ /\ \ V /
| |/__ U / \ u U_|"|_u
\____| /_/\_\ |_|
_// \\,-,>> \\_.-,//|(_
(__)(__)\_) (__)\_) (__)
_
U /"\ u ___
\/ _ \/ |_"_|
/ ___ \ | |
/_/ \_\ U/| |\u
\\ >>.-,_|___|_,-.
(__) (__)\_)-' '-(_/
_ ____ __ __
|"| / __"| u \ \ / /
U | | u <\___ \/ \ V /
\| |/__ u___) | U_|"|_u
|_____||____/>> |_|
// \\ )( (__).-,//|(_
(_")("_)(__) \_) (__)
9.关闭特定的自动配置
关闭特定的自动配置使用@SpringBootApplication注解的exclude参数即可,这里以关闭数据源的自动配置为例
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}
九、访问静态资源文件
1.默认配置
-
在我们开发web应用的时候,需要引用大量的js、css、图片等静态资源
-
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
-
1.classpath: /static
-
2.classpath : / public
-
3.classpath: /resources
-
4.classpath:/META- INF /resources
-
-
举例:我们在src/main/resources目录下新建public、resources、static、/META- INF /resources四个目录,并分别放入1.jpg 2.jpg 3.jpg 4.jpg四张图片。然后通过浏览器分别访问:
-
1.http : // localhost: 8080/1.jpg
-
2.http:// localhost:8080/2.jpg
-
3.http: // localhost:8080/3.jpg
-
4.http:/ / localhost:8080/4.jpg
-
-
地址均可以正常访问,Spring Boot默认会从 public resources static /NETA-INF/resources四个目录里面查找是否存在相应的资源。
2、在application.properties配置
#静态文件请求匹配方式
spring.mvc.static-path-pattern=/youruike/**
#修改默认的静态寻址资源目录多个使用逗号分隔
spring.resources.static-locations = classpath:/META-
INF/resources/ ,classpath:/resources/ ,classpath:/static/,classpath:/public/ ,classpath: / mytest/
配置中配置了静态模式为/youruike/*,访问时候就只能通过/youruike/xx来访问。
访问地址: http://localhost:8080/youruike/5.jpg
3、自定义静态资源地址
MywebMvcconfiguration webMvcConfigurer
@override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(" /mystatic/*" ).addResourceLocations( "classpath : / mystatic/ " );
}
访问地址: http://localhost:8080/mystati/6.jpg
十、YAML和Properties详解
1.Yaml的介绍
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
-
application.properties
-
application.yml/yaml
-
bootstrap.properties.
-
bootstrap.yml
因为bootstrap.properties的加载是先于application.properties的。
因为bootstrap.yml的加载是先于application.yml的。
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML (YAML Ain't Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn't Markup Language:不是一个标记语言;
标记语言: 以前的配置文件; 大多都使用的是 xxx.xml文件; YAML: 以数据为中心,比json、xml等更适合做配置文件
Yaml的使用
<! --导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</ artifactId><optional>true</ optional>
</ dependency>
public class Teacher {
private String name;
private string introduce;
public String getName( ) {
return name;
}
public void setName ( string name) {
this.name = name;
}