文章目录

  • 一、配置优先级
  • 1.1 命令行设置端口号
  • 1.2 打包后修改端口号
  • 1.3 优先级 小结
  • 二、Bean的管理
  • 2.1 获取Bean
  • 2.2 Bean作用域
  • 2.3 第三方Bean
  • 三、剖析Springboot的底层原理
  • 3.1 起步依赖
  • 3.2 自动配置
  • 3.2.1 第三方类装配
  • 3.2.2 原理分析
  • 总结
  • Web后端开发总结:
  • 源码跟踪技巧:



一、配置优先级

配置文件优先级排名(从高到低):

  1. properties配置文件
  2. yml配置文件
  3. yaml配置文件

1.1 命令行设置端口号

  1. Java系统属性配置 (格式: -Dkey=value)
-Dserver.port=9000
  1. 命令行参数 (格式:–key=value)
--server.port=10010

spring 优先级Order spring bean 优先级_后端

1.2 打包后修改端口号

java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010
java -Dserver.port=9000 -jar XXXXX.jar

spring 优先级Order spring bean 优先级_java_02

1.3 优先级 小结

spring 优先级Order spring bean 优先级_java_03

二、Bean的管理

2.1 获取Bean

默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了。

主动从IOC容器中获取到bean对象,3种常用方式:

  1. 根据name获取bean
Object getBean(String name)
  1. 根据类型获取bean
<T> T getBean(Class<T> requiredType)
  1. 根据name获取bean(带类型转换)
<T> T getBean(String name, Class<T> requiredType)

测试:

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext; //IOC容器对象

    //获取bean对象
    @Test
    public void testGetBean(){
        //根据bean的名称获取
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);

        //根据bean的类型获取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);

        //根据bean的名称 及 类型获取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }
}

默认单例,都是同一个对象(这里主要针对于默认的单例非延迟加载的bean而言。)

spring 优先级Order spring bean 优先级_spring boot_04

注意事项:

  • IOC容器中的bean默认使用的作用域:singleton (单例)
  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)

2.2 Bean作用域

作用域

说明

singleton

容器内同名称的bean只有一个实例(单例)(默认)

prototype

每次使用该bean时会创建新的实例(非单例)

Spring中的@Scope注解来进行配置作用域:

spring 优先级Order spring bean 优先级_java_05

注意事项:

  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性

2.3 第三方Bean

spring 优先级Order spring bean 优先级_java_06


spring 优先级Order spring bean 优先级_spring boot_07


声明形参,自动装配:

spring 优先级Order spring bean 优先级_spring boot_08

三、剖析Springboot的底层原理

3.1 起步依赖

starter启动器 :maven的依赖传递

3.2 自动配置

SpringBoot项目在启动时通过自动配置完成了bean对象的创建。

SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

spring 优先级Order spring bean 优先级_spring 优先级Order_09

@Configuration底层包括service/controller…都是@Component

3.2.1 第三方类装配

自动装配需要满足:

  1. 添加注解
  2. 注解被spring的组件扫描到

如果需要使用第三方类,除了添加注解,也要确保注解会被扫描到:

  • 方案1:@ComponentScan 组件扫描
  • 方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)
  • 方案1:@ComponentScan
@SpringBootApplication
@ComponentScan({"com.wake","com.example"}) //指定要扫描的包
public class SpringbootWebConfig2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }
}
  • 方案2:@Import 导入

导入形式主要有以下几种:

  1. 导入普通类
  2. 导入配置类
  3. 导入ImportSelector接口实现类
  4. 使用第三方依赖提供的 @EnableXxxxx注解

import:

@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
@SpringBootApplication
public class SpringbootWebConfig2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }
}

EnableXxxxx:

  • 第三方依赖中提供的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig { 
}
  • 在使用时只需在启动类上加上@EnableXxxxx注解即可
@EnableHeaderConfig  //使用第三方依赖提供的Enable开头的注解
@SpringBootApplication
public class SpringbootWebConfig2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }
}

3.2.2 原理分析

@SpringBootApplication:

spring 优先级Order spring bean 优先级_spring boot_10


总结

Web后端开发总结:

spring 优先级Order spring bean 优先级_java_11


spring 优先级Order spring bean 优先级_优先级_12

SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。

源码跟踪技巧:

  • 在跟踪框架源码的时候,一定要抓住关键点,找到核心流程。
  • 一定不要从头到尾一行一行代码去看,一个一个方法的去研究,一定要找到关键流程,抓住关键点,
  • 先在宏观上对整个流程或者整个原理有一个认识,有精力再去研究其中的细节。