一 Spring Boot的一些概念
1. Spring Boot是什么?
它是一种以更简单的方式来使用Spring生态下所有技术的框架,用于简化Spring项目的
构建、开发、配置、部署与jar报引用。简而言之,我们可以说Spring Boot只是Spring本身
的扩展,使开发,测试和部署更加方便。这样也就明白了SpringBoot和Spring Cloud的区别。
也有的地方是这样讲的:Spring boot 是 Spring 的一套快速配置脚手架(Spring Boot,看名
字就知道是Spring的引导)
2. Spring Boot与Spring、Spring Boot与Spring Cloud的区别?
(1)Spriing Boot和Spring
SpringBoot是Spring的扩展,它解决了Spring的三大痛点问题。
Spring的三大痛点问题(以启动一个带Hibernate的Spring MVC为例):
-- 依赖太多了,而且要注意版本兼容。这个应用,要添加10-20个依赖,Spring相
关的包10多个,然后是Hibernate包,Spring与Hibernate整合包,日志包,json
包一堆,而且要注意版本兼容性。
-- 配置太多了,要配置注解驱动,要配置数据库连接池,要配置Hibernate,要配
置事务管理器,要配置Spring MVC的资源映射,要在web.xml中配置启动Spring
和pring MVC等
-- 部署和运行麻烦。要部署到tomcat里面。不能直接用java命令运行。太多重复和
大家都一样的配置了。
Spring Boot正好解决了上述问题,其哲学思想是约定大于配置。既然很多东西都是
一样的,为什么还要去配置。
-- 通过starter(starter是启动依赖机制,start是指在pom中导入少量依赖缺可以在
工程中自动引入大量依赖)和依赖管理解决依赖问题。
-- 通过自动配置,解决配置复杂问题。
-- 通过内嵌web容器,由应用启动tomcat,而不是tomcat启动应用,来解决部署运
行问题
Spring Boot和Spring的之间的详细关系可以查看文章:
https://www.jianshu.com/p/ffe5ebe17c3a
Spring Boot和Spring Cloud的区别:
-- Spring Cloud是微服务框架,微服务体系开发中的架构问题,提供了一整套的解
决方案;
-- Spring Boot是Spring框架的扩展可以基于spring boot 快速开发单个微服务。它是
为了解决Spring中的一些痛点而产生的
3. Spring Boot工程目录介绍
别的不说,都会,这里只介绍static和templates
static:存放静态资源文件
templates:存放动态资源文件
2.Spring Boot的四大核心机制
(1)起步依赖机制
通过起步依赖机制(starter),简化jar包的引用,解决jar版本冲突问题
SpringBoot起步依赖机制主要用来简化jar包的依赖,并通过大量的测试,解决了不同
jar之间的版本冲突问题。使得开发人员只需要关注代码的实现,而不必在jar包依赖上花费
过多心思。
Spring Boot通过启动依赖机制为我们引入了大量的依赖,如果我们不需要某个jar包,
我们可以通过<exclusion></exclusion>进行屏蔽
在Maven中,可以使用<exclusions>: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
自定义要使用jar包的版本,而不使用启动依赖机制中的jar包
(2)自动配置
自动配置是指可以实现简单配置,甚至是零配置(比如我搭建一个Spring Boot项目,
什么都不配,就可以启动,这就是零配置),就能搭建整套框架,它尽量减少开发人员对
配置的编写。
注:并不代表Spring Boot可以零配置哈。
这里补充一些知识:
(a)Spring 获取bean的几种方式
-- 读取xml文件的方式,这种在初学入门的时候比较适用
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:tt.xml"); ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:tt.xml");
-- 继承spring的Aware类,覆盖方法实现获取上下文,从上下文中获取。
* 继承自抽象类ApplicationObjectSupport
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获
取到ApplicationContext。Spring初始化时,会通过该抽象类的
setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象
注入。
* 继承自抽象类WebApplicationObjectSupport
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
* 实现接口ApplicationContextAware
当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的
所有bean。换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到
的bean对象。
使用例子:
第一步,定义一个工具类,实现 ApplicationContextAware,实现
setApplicationContext方法
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context)
throws BeansException {
SpringContextUtils.context = context;
}
public static ApplicationContext getContext(){
return context;
}
}
如此一来,我们就可以通过该工具类,来获得 ApplicationContext,进
而使用其getBean方法来获取我们需要的bean。
第二步,在Spring配置文件中注册该工具类
之所以我们能如此方便地使用该工具类来获取,正是因为Spring能够
为我们自动地执行 setApplicationContext 方法,显然,这也是因为
IOC的缘故,所以必然这个工具类也是需要在Spring的配置文件中进行
配置的。
<!--Spring中bean获取的工具类--> <bean id="springContextUtils" class="com.zker.common.util.SpringContextUtils" />
第三步,编写方法进行使用
一切就绪,我们就可以在需要使用的地方调用该方法来获取bean了。
/** * 利用Ajax实现注册的用户名重复性校验 * @return */ public String ajaxRegister() throws IOException { UserDao userDao = (UserDao)SpringContextUtils.getContext().getBean("userDao"); if (userDao.findAdminByLoginName(loginName) != null || userDao.findUserByLoginName(loginName) != null) { message.setMsg("用户名已存在"); message.setStatus(false); } else { message.setMsg("用户名可以注册"); message.setStatus(true); } return "register"; }
-- 借助于spring提供的工具类
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取
ApplicationContext对象,然后在通过它获取需要的类实例。 下面两个工具方式的区别
是,前者在获取失败时抛出异常,后者返回null。
import org.springframework.web.context.support.WebApplicationContextUtils; ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc) ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc) ac1.getBean("beanId"); ac2.getBean("beanId");
(b)一些注解
-- @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个
或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或
AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化
Spring容器。@Configuration可理解为用spring的时候xml里面的<beans>标签;
@Bean可理解为用spring的时候xml里面的<bean>标签
AnnotationConfigWebApplicationContext:使用AnnotationConfigApplicationContext
可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配
置。位于spring-context.jar;AnnotationConfigEmbeddedWebApplicationContext是
spring boot中的WebApplicationContext。
WebApplicationContext
WebApplicationContext是专门为web应用准备的,他允许从相对于web根目录
的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得
ServletContext的引用,整个Web应用上下文对象将作为属性放置在ServletContext
中,以便web应用可以访问spring上下文,spring中提供WebApplicationContextUtils
的。
在以前的spring项目中,会有两个WebApplicationContext,一个是parent,从
applicationContext.xml里加载的,一个是child,从servlet-context.xml里加载的。两
者是继承关系,child WebApplicationContext 可以通过getParent()函数获取到
root WebApplicationContext。也就是说,我们常常通过listener初始化parent,并
component-scan扫描非controller类。而通过servlet初始化child,只扫描controller类。
这样便于在child可注入parent中的bean,反之就不行(自己感觉这就是父子容器)。
-- @ConfigurationProperties("xxx") 注解
加上该注解后,就会注入在application.properties中xxx开头的属性。
示例:
Person.java
@Component @ConfigurationProperties(prefix="person") public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
application.properties
person.name=Five
person.age=20
此时Person.java中的name和age的值分别被注入Five和age
测试Controller
package ai.yunxi.springBootDemo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired private JdbcTemplate template; @Autowired private Person person; @RequestMapping("/sayHello") public String sayHello(){ System.out.println("template:"+template); return "Hello "+person.getName()+"!"; } }
-- @ConditionalOnClass:据说后面会讲到
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
@RestController 定义一个Controller为RestController,RestController响应的是字符串而不是视图
(3)Spring Boot CLI
一种命令行工具。
-- 可以构建SpringBoot项目,其实还是通过https://start.spring.io/去构建工程的
例:spring init --dependencies=web,mysql,jdbc bootProject
-- 可以执行Groovy脚本(spring run命令)
例:spring run hello.groovy
-- 例:spring jar bootProject.jar *.groovy
(4)Actuator
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过
它们了解应用程序运行时的内部状况。可以知道Bean在Spring应用程序上下文
里是如何组装在一起的,掌握应用程序可以获取的环境属性信息等。其实说白
了就是一些端点。
(a)开启Actuator需要的一些配置
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
端点相关的配置
#设置端点路径
management.endpoints.web.base-path=/
#暴露端点
management.endpoints.web.exposure.include=*
#隐藏端点
management.endpoints.web.exposure.exclude=env,metrics
(b)要熟悉的一些端点(标红的)
GET /configprops 描述配置属性(包含默认值)如何注入Bean
GET /beans 描述应用程序上下文里全部的Bean,以及它们的关系
GET /env 获取全部环境属性
GET /env/{name} 根据名称获取特定的环境属性值
GET /health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
GET /info 获取应用程序指定发布的信息,这些信息由info打头的属性提供
GET /mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
GET /httptrace 提供基本的HTTP请求跟踪信息(时间戳、 HTTP头等)
GET /threaddump 获取线程活动的快照
GET /conditions 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
POST /shutdown 关闭应用程序,要求management.endpoint.shutdown.enabled设置为true
二 Spring Boot框架构建的四种方式
1. Spring Tool Suite
2. SpringBoot CLI
3. Spring Initializr
4. 手动引用jar包
三 Spring Boot热部署
热部署就是我们对一些Java文件、Jsp文件、配置文件等进行了一些修改之后,项目来帮我们自动
重启、重新加载的过程,不需要每次修改自己都需要手动进行重启。
1. 实现热部署只需要添加如下依赖即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!--取消传递依赖--> </dependency>
2. 其它一些重要配置
#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录,可以是任意位置的文件夹(工程内和工程外,其中的文件或文件内容发生改变则重启服务)
spring.devtools.restart.additional-paths: src/main/java
#修改默认不重启目录(/META-INF/maven、/META-INF/resources、/resources、/static、/templates、/public)
spring.devtools.restart.exclude: WEB-INF/**
#添加额外不重启目录
spring.devtools.restart.additional-paths
四 Spring Boot与MyBatis集成
不做笔记了看视频“第07节-MyBatis集成.vep”吧 总共才9分钟
五 Spring Boot与Security集成
看视频
四 Spring Boot与MyBatis集成
看视频