尚硅谷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核心技术学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

保姆级尚硅谷SpringCloud学习笔记(更新中)

spring (4.0.2)——(尚硅谷)学习笔记1

尚硅谷Spring学习笔记-- JdbcTemplate

尚硅谷Spring学习笔记-- Spring5新功能

尚硅谷Spring学习笔记-- 事务操作

尚硅谷Redis学习笔记-- Redis数据类型