Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入,数据绑定,面向方面的编程,数据访问等等。随着Spring社区的壮大,Spring慢慢变得越来越复杂,不再像开始宣称的那么轻量级。开发应用程序的配置量越来越大令开发者头疼。这时Spring Boot就派上用场了 - 它采用“约定大于配置”的思想简化了配置,对Spring提供的功能和配置而且将一些功能抽象成为“Starter”开箱即用、按需引用。极大地简化了开发。
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
application和bootstrap
区别:application 配置文件主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有三个应用场景。
使用Spring Cloud Config配置中心时,需要在 bootstrap 配置文件中添加连接到配置中心的配置属性,来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密或解密的场景;
原文链接:https://blog.csdn.net/weixin_44772609/article/details/115106450
多环境下核心配置文件的使用:
工作中开发环境有哪些:开发环境、测试环境、准生产环境,生产环境
主要有.properties 和 .yml格式,它们的区别主要是书写格式不同。另外,.yml 格式不支持 @PropertySource 注解导入配置。
继承spring-boot-starter-parent项目
导入spring-boot-dependencies项目依赖
参考链接https://blog.csdn.net/weixin_40496191/article/details/109098491
springboot启动的关键主要有两个地方,第一个就@SpringBootApplication注解,第二个就是 SpringApplication.run(SpringBoot.class, args);
SpringApplication.run(SpringBoot.class, args); 完成Spring容器的初始化过程
@SpringBootApplication注解
主要是由以下三个注解组成
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@SpringBootConfiguration类似于@Configuration它的作用就是将当前类申明为配置类
@EnableAutoConfiguration注解
它主要就是通过内部的方法,扫描classpath的META-INF/spring.factories配置文件(key-value),将其中的
org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的配置项实例化并且注册到spring容器。
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
** 在核心配置文件application.properties自定义配置一个一个获@value**
配置文件application.properties
school.name=betty
website = www.baidu.com
控制层:
@Controller
public class IndexController {
@Value("${school.name}")
private String schoolName;
@Value("${website}")
private String website;
@RequestMapping("/say")
public @ResponseBody String say(){
return "hello:"+schoolName+":"+website;
}
}
在核心配置文件application.properties将自定义配置映射到一个对象
获取的信息存在同名,不属于一个类,可以通过创建类加注解的方式注入
在类上加注解@Component+@ConfigurationProperties(prefix = “xx”)括号中的前缀一定要加上
如果我们使用Maven构建一个项目,那么该文件应放在resources / META-INF目录中。
1)首先导入依赖
pom.xml
<!--引入springboot内嵌tomcat对jsp的解析依赖,不添加解析不了jsp-->
<!--仅仅展示jsp,所以只需要添加以下一个依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
2)在核心配置文件中配置视图解析器
application.properties
#配置视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
3)创建webapp存放jsp文件,并将其添加到依赖中
4)指定jsp编译路径
pom.xml
存放在标签下
<!--springboot默认推荐使用的前端模板引擎是thymeleaf
现在我们要使用springboot集成jsp,手动指定jsp最后编译路径
而且spring boot集成jsp编译jsp的路径是spring boot规定好的位置
META-INF/resources-->
<resources>
<resource>
<!--源文件夹-->
<directory>src/main/webapp</directory>
<!--指定编译到-->
<targetPath>META-INF/resources</targetPath>
<!--指定源文件夹中的哪个文件要进行编译-->
<includes>
<include>*.*</include>
</includes>
</resource>
</resources>
1)导入mybatis jar包
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.0version>
dependency>
2)mybatis的配置文件
#配置mybatis
#配置mapper.xml 文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
#mybatis 分页插件
pagehelper.helper-dialect=oracle
pagehelper.reasonable=true
pagehelper.page-size-zero=true
pagehelper.support-methods-arguments=true
pagehelper.params=pageNum=pageHelperStart;pageSize=pageHelperRows
3)编写/逆向生成mapper接口和XML
4)application.properties 配置mybatis.xml 文件路径及分页插件
5)在启动类上加注解扫描mapper接口
@MapperScan(“com.sc.springboot.mapper”)
补充说明
SpringBoot集成MyBatis最主要的是两个注解:@Mapper,@MapperScan
@Mapper需要在每一个mapper接口类上添加,作用扫描dao接口
@MapperScan是在spring boot入口启动类上添加,它是扫描所有的包
关于mapper映射文件存放的位置有以下两种写法:
1)将mapper接口和mapper映射文件存放到src/main/java同一目录下,还需要在pom.xml中手动指定资源文件夹路径resources
2)将mapper接口和mapper映射文件分开存放
mapper接口文件类存放到src/main/java目录下
mapper映射文件存放到resources(类路径)
在spring boot核心配置文件中指定mapper映射文件存放位置
spring boot下使用事务
在需要添加事务的方法上添加@Transational
事务是一个完整的功能,也叫做完整的业务
事务只跟DML语句有关系:增删改
sql语句:DML,DQL,DDL,TCL,DCL
@RestController
//相当于控制层类上加注解@Controller + 方法上加 @ResponseBody
//意味着当前控制层类中所有的方法返回的都是Json对象
@RequestMapping(value = “/**”,method = {RequestMethod.GET,RequestMethod.POST})
//该方法请求方式支持get和post请求
@GetMapping(“/queryStudentById2”)
//只接收get请求,如果请求方式不正确会报405错误。
@PostMapping(“/insert”) //该注解通常在新增数据的时候使用
@DeleteMapping(“/delete”) //该注解通常在新增数据的时候使用
@PutMapping(“/update”) // 该注解通常在修改数据的时候使用 更新操作
Spring Boot中的特殊注解
@SpringBootApplication注解分析
@SpringBootApplication是一个复合注解,包括
@ComponentScan
@SpringBootConfiguration
@EnableAutoConfiguration。
1.@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
2.@EnableAutoConfiguration的作用启动自动的配置。
@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。
3.@ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的context:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理
@ResponseBody
表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用
@Controller
用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping
@RestController
用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@Service
一般用于修饰service层的组件
@Repository
使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
@Bean
用@Bean标注方法等价于XML中配置的bean。
@Value
注入Spring boot application.properties配置的属性的值。
@PathVariable 路径变量
@RequestHeader 请求头信息
@ModelAttribute
@RequestParam 请求参数
@MatrixVariable 矩阵变量
@CookieValue 获取cookie值
REST(英文:Representational State Transfer,简称REST)
一种互联网软件架构设计风格,但它并不是标准,它只是提出了一组客户端和服务器交互时的架构理念和设计原则,基于这种理念和原则设计的接口可以更简洁,更有层次,REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。
任何的技术都可以实现这种理念,如果一个架构符合REST原则,就称它为RESTFUL架构
比如我们要访问一个
http接口:http://localhost:8080/boot/order?id=1010&status=1
采用RESTFUL风格地址为:http://localhost:8080/boot/order/1010/1
spring boot使用restful风格
通常在restful风格中方法的请求方式会按增删改查的请求方式来区分
修改请求路径
restful请求要求路径中使用的单词都是名词,尽量不要使用动词
1)pom.xml中添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
<version>2.2.5.RELEASEversion>
dependency>
2)application.properties中配置redis连接
spring.redis.host=localhost //本机ip
spring.redis.port=6379 //本机端口
spring.redis.password=123456 //密码,如果没有可不写
业务层
@Autowired
private RedisTemplate
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@Override
public void put(String k, String v) {
redisTemplate.opsForValue().set(k,v);
}
@Override
public String get(String k) {
String name = (String) redisTemplate.opsForValue().get(k);
return name;
}
}
配置变更
JDK 版本升级
第三方类库升级
响应式 Spring 编程支持
HTTP/2 支持
配置属性绑定
更多改进与加强…
在pom.xml中添加一个插件
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
打成jar包只需添加下面的内容
<packaging>jarpackaging>
打成war包,将标签改成
<packaging>warpackaging>
Spring Boot是由一系列启动器组成的,这些启动器构成一个强大的灵活的开发助手。开发人员根据项目需要,选择并组合相应的启动器,就可以快速搭建一个适合项目需要的基础运行框架。
常用Spring Boot启动器:
Springboot默认异常处理机制
1)通过basicerrorcontroller定义发生的异常 视图或返回json错误数据
2)可再模板引擎目录下创建error目录,并在该目录下自定义500,404错误页面
springboot全局异常处理
springboot可以通过@controlleradvice+@exceptionhandler实现全局异常处理。可以实现特定异常的特殊处理。
springboot默认使用logback日志系统,无需多余的配置,可以直接使用,默认日志只打印的控制台上,日志级别为info,debug,error,warn
#日志配置
#指定日志文件生成的位置
logging.path=E:\\log
#指定日志文件名 logging.path与logging.file不能同时出现
#logging.file=springboot.log
#配置整个项目的日志级别 调试debug
springboot页面展示推荐使用模板引擎实现,不推荐使用jsp,常用的模板引擎thymeleaf,freemarker,springboot推荐使用thymeleaf。
thymeleaf模板
thymeleaf是springboot推荐的模板,具有如下特点
1)动静结合:可以当做静态来查看,也可以展示动态数据。
动态标签不会影响静态数据的查看,当动态内容无法加载时会显示静态内容。
2)与springboot完美整合,默认支持thymeleaf无需过多配置。
3)多方言支持:支持spring,springMVC方言。
thymeleaf创建
1)创建HTML页面,并添加th命名空间
xmlns:th="http://www.t hymeleaf.org"
2)在idea模板中新建一个thymeleaf模板
thymeleaf语法:
1)th标签属性:thymeleaf的标签都是以th开头,编写在HTML元素标签上,作为HTML元素的一个属性标签(id,class,name href)。
a. th:text 设置当前元素的文本内容
例如:
<div th:text="${info}"> 默认内容div>
b. th:value
c. th:src
d. th:href
e. th:action
f. th:object 获取到单个对象,在写有该标签内获取该对象的值时使用*{属性名}即可
g. th:title…
2)判断和遍历
a.th:if判断
b.th:each 遍历
3)表达式语法
a.${}变量表达式,获取域中的数据,与el表达式类似
变量表达式取值时可以使用一些内置对象,默认是获取request域中的内容
a)session 获取session域中内容
b)param获取request请求参数
b.@{}连接表达式,会自动添加上项目名,如果需要添加参数则在后面加(key=value,key2=value2…)
修改
c.#{}消息表达式 用来做国际化的
d.*{}选择变量表达式 配置 th:object使用
e.~{}代码块表达式,引入代码块 (include)
1)th:insert 将代码块插入到th:insert所在标签中
2) th:replace用代码块替换掉th:replace所在标签中。
3) th:include将代码块的内容插入th:include所在标签。
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用户列表title>
head>
<body>
<table>
<tr>
<td>idtd>
<td>用户名td>
<td>密码td>
<td>真实姓名td>
<td>头像td>
<td>状态td>
<td>性别td>
<td>创建时间td>
<td>操作td>
tr>
<tr th:object="${admin}" th:each="admin:${adminlist}">
<td th:text="*{id}">td>
<td th:text="*{account}">用户名td>
<td th:text="*{password}">密码td>
<td th:text="*{name}">真实姓名td>
<td ><img style="height:30px;width: 20px "
th:src="@{*{#strings.isEmpty(headpic)?'/images/timg%20(4).jpg':headPic}}" >
td>
<td th:text="*{status eq'0'?'正常':'注销'}">td>
<td >
<span th:if="*{sex eq '0'}">男span>
<span th:if="*{sex eq '1'}">女span>
td>
<td th:text="*{#dates.format(createtime,'yyyy-MM-dd')}">td>
<td>
<a th:href="@{/update(id=*{id})}">修改a>
<a th:href="@{/delete(id=*{id})}">删除a>
td>
tr>
table>
body>
html>
引用静态资源文件(CSS使用th:href,js使用使用th:src)
引入CSS
4)内置方法
a.strings:字符串操作方法,提供常用的字符串操作,非空。截取,长度,是否包含字符,字符小标
b.number:数值的格式化方法
c.list:集合对象方法size,isempty,contains…
d.Dates:日期常用方法 format,createnow,year,month…
e.maps:map集合方法 size,isempty,containskey ,containsvalue…
f. arrays:数组方法
5)运算符操作
a.+ - * / % 算数运算
b.逻辑运算 and or not !
c.比较运算 > , < , >= , <= ( gt , lt , ge , le ) == , != ( eq , ne )
星号与$符号之间?
星号相当于前缀 ${admin}=*
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="*{lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
//等价于
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="${s定义ession.user.nationality}">Saturnspan>.p>
div>
@EnableAutoConfiguration注解、 @Configuration注解和 @ConditionalOnClass注解组成了Spring Boot自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。具体是通过maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建在spring容器中的bean。
Spring boot actuator 是 spring 启动框架中的重要功能之一,Spring boot 监视器可以访问生产环境中正在运行的应用程序的当前状态。监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态。
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
IOC容器初始化
SpringBoot项目最终打包成的jar是可执行的jar,这种jar可以直接通过Java -jar xxx.jar命令来运行,这种jar不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。
SpringBoot的jar无法被其他项目依赖,主要还是他和普通的jar结构不同。
普通的jar包,解压后直接就是包名,包里就是我们的代码,而SpringBoot打包成的可执行jar解压后,在\Boot-INf\classes目录下才是我们的代码,因此无法直接被引用。
如果非要引用,可以在pom.xml文件中增加配置,将SpringBoot项目打包成两个jar,一个可执行,一个可引用。
常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。
spring-boot-starter-web:提供web开发需要的servlet与jsp支持+内嵌的tomcat.
spring-boot-starter-data-jpa:提供spring jpa + hibernate
spring-boot-starter-data-redis:提供redis
mybatis-spring-boot-starter:第三方的mybatis集成starter
为了实现spring boot的安全性,我们使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigureAdapter并覆盖其方法。
可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,他们都只提供了一个run()方法,实现上述接口的类加入IOC容器即可生效
这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。
SpringBoot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动启动服务器。
开发人员可以重新加载SpringBoot上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。SpringBoot在发布他第一个版本时没有这个功能。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
dependency>
1.打包用命令或者放到容器中运行
2.用Maven/Gradle插件运行
使用命令 mvn tomcat:run ,使用tomcat运行spring boot
使用命令 mvn jetty:run ,这里出现错误
使用命令 mvn spring-boot:run
3.直接执行main方法运行