Spring Boot 复习
简介
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭 建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 配置。通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。其特点如下:
- 创建独立的Spring应用程序
- 嵌入的Tomcat,无需部署war文件
- 简化Maven配置
- 自动配置Spring
- 提供生产就绪型功能,如指标、健康检查和外部配置
- 没有代码生成和不要求配置xml
环境搭建
创建maven工程(不用骨架,打包方式jar)
添加起步依赖
继承SpringBoot的起步依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
导入web的启动依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写引导类(任意命名)
@SpringBootApplication
public class NewSpringBootApplication{
public static void main(String[] args){
SpringApplication.run(NewMySpringBootApplication.class);
}
}
编写Controller
@Controller
public class HelloController{
@RequestMapping("/hello")
@ResponseBody //说明返回的是json字符串
public String hello(){
return "hello springboot";
}
}
注意事项
所有的SpringBoot项目必须继承SpringBoot的起步依赖
添加依赖时以功能为单位
@SpringBootApplication 声明该类是一个SpringBoot引导类
SpringApplication.run(引导类.class) 表示运行SpringBoot的引导类(引导类和main方法可以分开)
SpringBoot工程的热部署,更改代码后不需要重启项目即可生效
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
导入坐标后设置IDEA自动编译:
Settings --> Compiler --> select Build project automatically --> apply
press control+shift+/ --> Registry --> select compiler.automake.allow.when.app.running
IDEA快速创建SpringBoot项目
new project --> Spring Initializr --> select dependencies --> [delete .gitignore & mvnw & mvnw.cmd] --> create Controller
@RestController = @Controller + @ResponseBody
原理分析
起步依赖
parent:当前项目 --> 继承spring-boot-starter-parent(处理配置文件,插件管理) --> 继承spring-boot-dependencies(maven 版本约定,依赖管理)
web:spring-boot-starter-web-2.0.1.RELEASE.pom中导入了tomcat,json等坐标
自动配置
@SpringBootApplication
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //配置类
@EnableAutoConfiguration //允许自动配置
@ComponentScan( //自动扫描组件,约定引导类所在的包及子包所有的类都会扫描
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}
@SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration //spring的配置类注解
public @interface SpringBootConfiguration {...}
@EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) //当前配置类引入其他配置类
public @interface EnableAutoConfiguration {...}
AutoConfiturationImportSelector.class
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
//调用getAutoConfigurationEntry()
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
} protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
//调用getCandidateConfigurations(),返回配置类的全包名
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
} protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
//错误信息说明了配置类的信息存在spring.factories中
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
org.springframework.boot:spring-boot-autoconfigure:2.2.2.RELEASE/spring-boot-autoconfigure-2.2.2.RELEASE.jar/META-INF/spring.factories
...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
...
流程
- 通过配置文件提前进行默认配置
- 用ServerProperties类加载配置
- 用XxxAutoConfiguration类引入
- 用spring.factories存入多个AutoConfiguration全限定类名
- AutoConfigurationImportSelector类加载spring.factories获取配置信息
- @EnableAutoConfiguration引入AutoConfigurationImportSelector完成自动配置
覆盖配置
spring-boot-starter-parent-2.0.1.RELEASE.pom中include标签有application*.yml(.yaml/.properties),可以通过自定义对应配置文件进行覆盖
配置文件
位置:resources目录下
顺序:多个配置文件时,yml > yaml > properties,后加载的会覆盖之前的
yml语法
# 普通数据
name: whteway
# 对象(常用)
user:
username: root
password: 1234
# 行内对象配置
user: {username: root,password: 1234}读取配置信息
@Value 精确,繁琐
@Value("${name}")
private String name;
@Value("${user.username}")
private String username;
@ConfigurationProperties 自动封装,需要配置configuration processor
@Controller
@ConfigurationProperties(prefix="user")
public class LoginController{
private String username;
private String password;
//generate getters and setters
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
集成Mybatis
添加起步依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
添加数据库驱动坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
添加数据库连接信息,application.yml
spring:
datasource:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbName?useUnicode=true?characterEncoding=utf8
username=root
password=root
建库建表
配置映射关系
UserMapper.xml
SpringBoot的配置文件中配置Mybatis的信息
mybatis:
type-aliases-package=com.whteway.entity
mapper-locations=classpath:mapper/*Mapper.xml
集成Junit
添加起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
编写测试类
@RunWith(SpringRunner.class)
@SpringBootTes(classes="引导类全包名")
public class Test{
@Test
public void test(){...}
}
集成SpringDataJPA
添加起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
添加数据库驱动坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
添加数据库连接信息,application.yml
spring:
datasource:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbName
username=root
password=root
建库建表
建实体类
@Entity
public class User{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String username;
...
}
建接口
public interface UserRepository extends JpaRepository<User, Long>{
public List<User> findAll();
}
SpringBoot的配置文件中配置Mybatis的信息
spring:
jpa:
database: MySQL
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: update
naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
集成Redis
添加起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置连接信息
spring:
redis:
host=127.0.0.1
port=6379
测试
@RunWith(SpringRunner.class)
@SpringBootTes(classes="引导类全包名")
public class Test{ @Autowired
private RedisTemplate<String, String> redisTemplate; @Autowired
private UserRepository userRepository; @Test
public void test(){
String userListJson = redisTemplate.boundValueOps("user.findAll").get();
if(null==userListJson){
List<User> all = userRepository.findAll();
ObjectMapper objectMapper = new ObjectMapper();
userListJson = objectMapper.writeValueAsString(all);
redisTemplate.boundValueOps("user.findAll").set(userListJson);
}
System.out.println(userListJson);
}
}
Spring Boot 复习的更多相关文章
- [Java复习] Spring Boot
什么是Spring Boot? 传统SSH/SSM框架配置繁琐,有很多重复的模板配置,效率不高. Spring Boot快速创建可独立运行,生产级别的Spring应用程序. 主要是基于Spring家族 ...
- Spring Boot 2.x整合Redis
最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...
- Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统
一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- spring boot 系列之一:spring boot 入门
最近在学习spring boot,感觉确实很好用,开发环境搭建和部署确实省去了很多不必须要的重复劳动. 接下来就让我们一起来复习下. 一.什么是spring boot ? spring boot是干嘛 ...
- spring boot 搭建基本套路《1》
1. Spring复习 Spring主要是创建对象和管理对象的框架. Spring通过DI实现了IoC. Spring能很大程度的实现解耦. 需要掌握SET方式注入属性的值. 需要理解自动装配. 需要 ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
- Spring Boot 2.x基础教程:JSR-303实现请求参数校验
请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景.比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验.这种情况常见于需要同时开发前后端的时候,虽然 ...
- 2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1.什么是 Spring Boot? 2.Spring Boot 有哪些优点? 3.什么是 JavaConfig? 4.如何重新加载 Spring Boot 上的更改, ...
随机推荐
- cocoapods升级
1.更新gem:sudo gem update --system 先要查看下源,如果源被墙了就换地址:https://gems.ruby-china.com 1.1.删除gem源:gem source ...
- POJ 2516Minimum Cost(最小费用流+特判)
[题意]: 有N个人,M个仓库,每个人需要物品,个数都等于共同的K,仓库中有对应的K件物品的数量,随后给K个N*M矩阵(小写k, n, m表示K,N,M对应的子集),表明m个仓库到第n个人的位置运送k ...
- 用Python玩转微信
Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io ...
- nginx 静态资源服务
1.文件压缩 location ~ .*\.(jpg|gif|png)$ { gzip on(开启); gzip_http_version 1.1(版本); gzip_comp_level 2(压缩比 ...
- js冒泡排序,快速排序,插入排序
//冒泡排序 function sortBubble(array){ var len=array.length,i,j,tmp; for(i=len-1;i>=1;i--){ ...
- Numpy | 23 文件读写
Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形.dtype 和其 ...
- ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明
说明 这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用 新建工程 安装MQTT的jar包 implementation 'org.eclipse.paho:org.e ...
- 这样配置:让你的 IDEA 好用到飞起来
阅读本文大概需要 7 分钟. 来源:blog.csdn.net/fly910905/article/details/77868300 1.设置maven 1.在File->settings-&g ...
- 紧随时代的步伐--Java8之Lambda表达式的使用
1.前言 在计算机行业,每天都会有新的技术诞生,每天都会有上百种的技术更新升级.追随时代的步伐,终生学习,才能不被社会的浪潮淘汰. 2.关于Lambda表达式 Lambda表达式是Java8新特性之一 ...
- Python爬虫爬取BT之家找电影资源
一.写在前面 最近看新闻说圣城家园(SCG)倒了,之前BT天堂倒了,暴风影音也不行了,可以说看个电影越来越费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然越来越强,但是很多资源在 ...