尚硅谷spring boot 2核心技术学习笔记
Posted 江州益彤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷spring boot 2核心技术学习笔记相关的知识,希望对你有一定的参考价值。
参考资料
1、尚硅谷/SpringBoot2核心技术与响应式编程
2、springboot官网
3、版本升级变化
maven环境配置
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
一、spring boot helloworld
1.1、创建项目
1.2、pom.xml
<!-- 引入spring boot的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
</parent>
<dependencies>
<!-- 添加 Web 应用程序依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1.3、工程结构和主程序类
1.4、Controller
1.5、运行结果
二、spring boot通用配置(基于一spring boot helloworld)
https://docs.spring.io/spring-boot/docs/current/reference/html/
这里通过简单使用配置文件,修改tomcat的端口
三、spring boot简化部署(基于一spring boot helloworld)
创建可执行 Jar
在pom.xml的dependencies部分下方添加打包插件
<!-- spring-boot-maven-plugin要创建一个可执行的 jar-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 修改maven-resources-plugin版本,如果有错误,先在dependencies中引入依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
使用maven进行项目的打包
生成jar包
使用命令行代替服务器启动项目
一样可以访问:说明这打包时将tomcat等环境一起打包成jar包了,这样这服务器就可以不用安装tomcat等工具,节约成本
四、了解自动配置原理(基于一spring boot helloworld)
4.1、SpringBoot特点
父项目做依赖管理
1、自定义版本,替换spring boot引入的没人版本
查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
在当前项目里面重写配置,这样就导进来自己安装的数据库版本
2、开发导入starter场景启动器
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/
1、见到很多 spring-boot-starter-* : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
5、所有场景启动器最底层的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
4.2、自动配置
1、● 自动配好Tomcat
○ 引入Tomcat依赖。
○ 配置Tomcat
2、● 自动配好SpringMVC
○ 引入SpringMVC全套组件
○ 自动配好SpringMVC常用组件(功能)
3、● 自动配好Web常见功能,如:字符编码问题
○ SpringBoot帮我们配置好了所有web开发的常见场景
4、● 默认的包结构
○ 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
○ 无需以前的包扫描配置
○ 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.atguigu”)
○ 或者@ComponentScan 指定扫描路径
//@SpringBootApplication //等同下面的三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(“com.atguigu.boot”)//指定包扫描的基包
5、● 各种配置拥有默认值
○ 默认配置最终都是映射到某个类上,如:MultipartProperties
○ 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
6、● 按需加载所有自动配置项
○ 非常多的starter
○ 引入了哪些场景这个场景的自动配置才会开启
○ SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
4.3、容器功能
4.3.1、注册组件两种方式
一、使用@Configuration和@Bean注解方式
二、给容器导入组件@Import
1、 基本使用
MyConfig.java
/**
* @Configuration:告诉SpringBoot这是一个配置类 == 配置文件
* proxyBeanMethods:表示代理bean的方法
* Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件依赖必须使用Full模式默认。其他默认是否Lite模式
*/
@Import(User.class, DBHelper.class)
@Configuration(proxyBeanMethods = true)
public class MyConfig
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01()
User zhangsan = new User("zhangsan", 18);
//因为proxyBeanMethods = true,所以user组件依赖了Pet组件,单实例
zhangsan.setPet(tomcatPet());
return zhangsan;
@Bean("tom")//使用参数自定义组件id
public Pet tomcatPet()
return new Pet("tomcat");
MainApplication.java
/*
* 主程序类:所有程序的启动入口
* @SpringBootApplication作用:这是一个springboot运用
*/
//@SpringBootApplication //等同下面的三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")//指定包扫描的基包
public class MainApplication
/*===========main方法===========*/
public static void main(String[] args)
//1、返回我们IOC容器,里面包含各种组件
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的所有组件
// String[] names = run.getBeanDefinitionNames();
// System.out.println("================");
// for (String name : names)
// System.out.println(name);
//
//3、从容器中获取组件,验证是否单实例组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
System.out.println("是否单实例组件:" + (tom01 == tom02));
System.out.println("================");
//4、配置类本身也是一个组件
MyConfig bean = run.getBean(MyConfig.class);
System.out.println("配置类本身也是一个组件:"+bean);
System.out.println("================");
//5、如果@Configuration(proxyBeanMethods = true)代理对象调用方法。
//SpringBoot总会检查这个组件是否在容器中有保持组件单实例
User user = bean.user01();
User user1 = bean.user01();
System.out.println("user == user1:" + (user == user1));
System.out.println("================");
//6、组件依赖
User user01 = run.getBean("user01", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("用户的宠物:"+(user01.getPet() == tom));
//使用@Import导入自定义和外部组件测试
String[] beanNamesForType = run.getBeanNamesForType(User.class);
System.out.println("======获取组件");
for (String s : beanNamesForType)
System.out.println(s);
DBHelper dbHelperBean = run.getBean(DBHelper.class);
System.out.println("dbHelperBean"+dbHelperBean);
4.3.2、条件装配@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
@Import(User.class, DBHelper.class)
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(name = "tom")//也可以注解在类上,表示容器中纯在tom组件时,才加载这个类里面的组件
public class MyConfig
//@ConditionalOnBean(name = "tom")//容器中存在tom组件时才加载user01组件,
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01()
User zhangsan = new User("zhangsan", 18);
//因为proxyBeanMethods = true,所以user组件依赖了Pet组件,单实例
//zhangsan.setPet(tomcatPet());
return zhangsan;
@Bean("tom22")//使用参数自定义组件id
public Pet tomcatPet()
return new Pet("tomcat");
4.3.3、原生配置文件引入@ImportResource
解决问题:一些公司还是使用xml文件配置方式,所以需要将这些文件引进来,进行解析配置
MainApplication.java
/*
* 主程序类:所有程序的启动入口
* @SpringBootApplication作用:这是一个springboot运用
*/
//@SpringBootApplication //等同下面的三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")//指定包扫描的基包
public class MainApplication
/*===========main方法===========*/
public static void main(String[] args)
//1、返回我们IOC容器,里面包含各种组件
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的所有组件
// String[] names = run.getBeanDefinitionNames();
// System.out.println("================");
// for (String name : names)
// System.out.println(name);
//
//3、从容器中获取组件,验证是否单实例组件
// Pet tom01 = run.getBean("tom", Pet.class);
// Pet tom02 = run.getBean("tom", Pet.class);
// System.out.println("是否单实例组件:" + (tom01 == tom02));
// System.out.println("================");
//
// //4、配置类本身也是一个组件
// MyConfig bean = run.getBean(MyConfig.class);
// System.out.println("配置类本身也是一个组件:"+bean);
// System.out.println("================");
//
// //5、如果@Configuration(proxyBeanMethods = true)代理对象调用方法。
// //SpringBoot总会检查这个组件是否在容器中有保持组件单实例
// User user = bean.user01();
// User user1 = bean.user01();
// System.out.println("user == user1:" + (user == user1));
// System.out.println("================");
//
// //6、组件依赖
// User user01 = run.getBean("user01", User.class);
// Pet tom = run.getBean("tom", Pet.class);
// System.out.println("用户的宠物:"+(user01.getPet() == tom));
//
// //使用@Import导入自定义和外部组件测试
// String[] beanNamesForType = run.getBeanNamesForType(User.class);
// System.out.println("======获取组件");
// for (String s : beanNamesForType)
// System.out.println(s);
//
//
// DBHelper dbHelperBean = run.getBean(DBHelper.class);
// System.out.println("dbHelperBean"+dbHelperBean);
//原生配置文件引入@ImportResource测试
boolean haha = run.containsBean("haha");
boolean hehe = run.containsBean("hehe");
System.out.println("haha:"+haha);//true
System.out.println("hehe:"+hehe);//true
4.3.4、配置绑定的properties文件的种方式
一、方式一,在bean上配置
使用
@Component
@ConfigurationProperties(prefix = “mycar”)
properties配置文件
接收解析properties配置文件的bean
二:方式二,在配置类,和bean上同时配置
@ConfigurationProperties(prefix = “mycar”)
public class Car
@EnableConfigurationProperties(Car.class)
public class MyConfig
bean文件
配置类文件
4.4、最佳实践
1、● 引入场景依赖
○ https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
2、● 查看自动配置了哪些(选做)
○ 自己分析,引入场景对应的自动配置一般都生效了
○ 配置文件中debug=true开启自动配置报告。控制台打印的Negative(不生效)、Positive(生效),如下:
3、● 是否需要修改
○ 参照文档修改配置项
■ https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
■ 自己分析。xxxxProperties绑定了配置文件的哪些。
实例:修改banner图
4、 ○ 自定义加入或者替换组件
■ @Bean、@Component…
○ 自定义器 XXXXXCustomizer;
○ …
五、开发小技巧
5.1、Lombok,简化JavaBean开发
作用:简化JavaBean开发
使用@Data注解,不用再写get、set方法
使用@ToString注解,不用再写tostring方法。
使用@NoArgsConstructor注解,不用再写无参构造方法。
使用@AllArgsConstructor注解,不用再写有参构造方法。
步骤一:引入依赖
<!-- 添加 lombok,简化JavaBean开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
步骤二:安装插件
file->settting->plugin
步骤三:
1、使用注解实现简化JavaBean开发
2、日志使用
5.2、dev-tools,热部署自动重启,加快项目的启动
<!-- 添加 devtools,热部署,加快项目的启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
使用
Ctrl+F9即可重新编译加载,并启动项目
5.3、pring Initailizr(项目初始化向导)
引入场景依赖和选择springboot版本
删除多余的文件
项目展开
六、SpringBoot2核心技术-核心功能
6.1、文件类型
6.1.1、properties
同以前的properties用法
6.1.2、yaml
一、简介
YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。 适合用来做以数据为中心的配置文件
二、基本语法
● key: value;kv之间有空格
● 大小写敏感
● 使用缩进表示层级关系
● 缩进不允许使用tab,只允许空格
● 缩进的空格数不重要,只要相同层级的元素左对齐即可
● '#‘表示注释
● 字符串无需加引号,如果要加,’'与""表示字符串内容 会被 转义/不转义
三、数据类型
1、字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
2、对象:键值对的集合。map、hash、set、object
行内写法: k: k1:v1,k2:v2,k3:v3
#或
k:
k1: v1
k2: v2
k3: v3
3、数组:一组按次序排列的值。array、list、queue
行内写法: k: [v1,v2,v3]
#或者
k:
- v1
- v2
- v3
== 实例 ==
person:
# 字面量:单个的、不可再分的值。date、boolean、string、number、null
userName: 'zhangsan \\n 王二毛' # 单引号会将\\n作为字符串输出,双引号会将\\n作为换行输出
boss: false以上是关于尚硅谷spring boot 2核心技术学习笔记的主要内容,如果未能解决你的问题,请参考以下文章