【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第1张图片

目录

一、配置优先级

1、配置(3种:.properties、yml、yaml)

①、配置文件优先级

②、如何指定Java系统属性和命令行参数

③、5种配置文件的优先级

二、Bean管理

1、获取bean(3种方法)

2、bean作用域(5种)

①、@Scope注解:配置作用域

3、第三方bean

①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)

②、声明配置类来管理第三方bean对象

③、如何在配置类中的第三方bean中引入方法对象

④、思考:@Component及衍生注解 与 @Bean注解使用场景?

三、SpringBoot原理

1、起步依赖

2、自动配置

①、什么是自动配置?

②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)

③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)

④、自动配置原理 -- 源码跟踪

⑤、自动配置原理 -- 条件装配注解(@Conditional)

⑥、自动配置原理 —— 小结

⑦、案例(自定义starter)

四、Web后端开发总结

1、三层架构


一、配置优先级

1、配置(3种:.properties、yml、yaml)

①、配置文件优先级

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第2张图片

优先级最高的是(.properties > .yml > .yaml

②、如何指定Java系统属性和命令行参数

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第3张图片

program arguments 优先级比 VM options 要高

命令行执行:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第4张图片

示例:

Ⅰ、正常运行一个 jar 包:

运行结果:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第5张图片

Ⅱ、指定Java系统属性和命令行参数:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第6张图片

③、5种配置文件的优先级

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第7张图片

二、Bean管理

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第8张图片

1、获取bean(3种方法)

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

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第9张图片

代码示例:(3种获得bean对象的方法)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第10张图片

运行结果:(但现在我们获取的bean对象是同一个,是单例的,我们可以通过某些方法将它设置为非单例的)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第11张图片

2、bean作用域(5种)

单例和多例取决于作用域

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第12张图片

注意事项:

①、@Scope注解:配置作用域

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第13张图片

测试代码:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第14张图片

Ⅰ、默认情况下:(单例)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第15张图片

Ⅱ、懒加载:

给DeptController类加上@Lazy注解,让其进行懒加载,即:不让Spring在程序启动时就实例化bean对象,而是在我们第一次请求它们时再创建:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第16张图片

测试结果:程序启动时,bean对象并没有被创建

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第17张图片

当依次使用这个bean对象时,这个对象才进行实例化:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第18张图片

Ⅲ、加上作用域@Scope("prototype"):表示每次使用bean时,都会创建新的实例

DeptController:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第19张图片

测试结果:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第20张图片

3、第三方bean

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第21张图片

以上bean对象以外的bean

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第22张图片

注意事项:

①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第23张图片

示例:

在启动类中声明第三方bean:(不建议使用这种方法

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第24张图片

②、声明配置类来管理第三方bean对象

配置类示例:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第25张图片

其次,我们可以通过@Bean注解的name/value属性来指定

bean的名称,如果未指定,默认是方法名:

测试bean对象的名称是否为方法名:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第26张图片

测试结果:

③、如何在配置类中的第三方bean中引入方法对象

直接作为形参引入:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第27张图片

④、思考:@Component及衍生注解 与 @Bean注解使用场景?

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第28张图片

三、SpringBoot原理

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第29张图片

1、起步依赖

假如我们没有使用SpringBoot,用的是Spring框架进行web程序的开发,此时我们就需要引入web程序开发所需要的一些依赖。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第30张图片

spring-webmvc依赖:这是Spring框架进行web程序开发所需要的依赖

servlet-api依赖:Servlet基础依赖

jackson-databind依赖:JSON处理工具包

如果要使用AOP,还需要引入aop依赖、aspect依赖

项目中所引入的这些依赖,还需要保证版本匹配,否则就可能会出现版本冲突问题。

如果我们使用了SpringBoot,就不需要像上面这么繁琐的引入依赖了。我们只需要引入一个依赖就可以了,那就是web开发的起步依赖:springboot-starter-web

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第31张图片

起步依赖的原理就是依赖传递

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第32张图片

2、自动配置

①、什么是自动配置?

示例:注入Gson对象

注入Gson对象:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第33张图片

Ⅰ、编写测试类(AutoConfigurationTests),并在其中自动注入Gson对象:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第34张图片

Ⅱ、运行结果:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第35张图片

 

问题:在当前项目中我们并没有声明谷歌提供的Gson这么一个bean对象,然后我们却可以通过@Autowired从Spring容器中注入bean对象,那么这个bean对象怎么来的?

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

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第36张图片

我们知道了什么是自动配置之后,接下来我们就要来剖析自动配置的原理。解析自动配置的原理就是分析在 SpringBoot项目当中,我们引入对应的依赖之后,是如何将依赖jar包当中所提供的bean以及配置类直接加载到当前项目的SpringIOC容器当中的。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第37张图片

②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第38张图片

示例:

单元测试:获取itheima-utils中的bean以及配置类:

运行结果:

③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第39张图片

示例:

Ⅰ、在启动类中导入 普通类

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第40张图片

Ⅱ、在启动类中导入 配置:(多个Bean)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第41张图片

Ⅲ、在启动类中导入 ImportSelector 接口实现类:

ImportSelector 接口实现类:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第42张图片

启动类导入:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第43张图片

Ⅳ、@EnableXxxx注解,封装了@Import注解(推荐)

让第三方依赖自己来指定要导入哪些bean和配置类

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第44张图片

在启动类上加上对应注解:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第45张图片

④、自动配置原理 -- 源码跟踪

@interface SpringBootApplication

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第46张图片

@SpringBootConfiguration注解上使用了@Configuration表明SpringBoot启动类就是一个配置类

@Indexed注解,是用来加速应用启动的(不用关心)。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第47张图片

@interface EnableAutoConfiguratiion

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第48张图片

⑤、自动配置原理 -- 条件装配注解(@Conditional)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第49张图片

示例:

@ConditionalOnClass:判断环境中是否有对应的字节码文件,才注册bean到IOC容器

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第50张图片

@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称),才注册bean到IOC容器(该注解的应用场景,通常是用来设置一个默认的bean对象)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第51张图片

@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器中

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第52张图片

@Conditional小结

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第53张图片

⑥、自动配置原理 —— 小结

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第54张图片

自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解底层包含了3个注解,分别是:

- @SpringBootConfiguration

- @ComponentScan

- @EnableAutoConfiguration

@EnableAutoConfiguration这个注解才是自动配置的核心。

  • 它封装了一个@Import注解,Import注解里面指定了一个ImportSelector接口的实现类。
  • 在这个实现类中,重写了ImportSelector接口中的selectImports()方法。
  • 而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC容器进行管理。
  • 那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。

  • @Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是 ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector  接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将哪些类交给 spring 的 IOC容器进行管理。
  • 此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是 autoConfiguration.imports。而在  autoConfiguration.imports 这份儿文件当中,它就会去配置大量的自动配置的类。
  • 而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上这么一类@Conditional 开头的注解。这个注解就是进行条件装配。所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这个bean,才会将这个 bean 交给 IOC 容器管理。

⑦、案例(自定义starter)

业务场景:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第55张图片

业务场景:

  • 我们前面案例当中所使用的阿里云OSS对象存储服务,现在阿里云的官方是没有给我们提供对应的起步依赖的,这个时候使用起来就会比较繁琐,我们需要引入对应的依赖。我们还需要在配置文件当中进行配置,还需要基于官方SDK示例来改造对应的工具类,我们在项目当中才可以进行使用。
  • 大家想在我们当前项目当中使用了阿里云OSS,我们需要进行这么多步的操作。在别的项目组当中要想使用阿里云OSS,是不是也需要进行这么多步的操作,所以这个时候我们就可以自定义一些公共组件,在这些公共组件当中,我就可以提前把需要配置的bean都提前配置好。将来在项目当中,我要想使用这个技术,我直接将组件对应的坐标直接引入进来,就已经自动配置好了,就可以直接使用了。我们也可以把公共组件提供给别的项目组进行使用,这样就可以大大的简化我们的开发。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第56张图片

实现步骤:

Ⅰ、创建aliyun-oss-spring-boot-starter模块:

  • 文件结构:

 由于aliyun-oss-spring-boot-starter模块只做依赖管理,所以其它文件就都可以删掉

  • pom.xml:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第57张图片

Ⅱ、创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块

  • 文件结构:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第58张图片

  • pom.xml:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第59张图片

  • 在starter中引入autoconfigure模块:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第60张图片

Ⅲ、在aliyun-oss-spring-boot-autoconfigure模块中定义自动配置功能,并定义自动配置文件 META-INF/spring/xxxx.imports

  • 在autoconfigure模块中的pom.xml文件引入阿里云OSS的依赖:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第61张图片

  • 将相关工具类也引入autoconfigure模块(如果有报错,需要自行修改)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第62张图片

  • 定义自动配置类(AliOSSAutoConfiguration):

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第63张图片

  • 定义自动配置文件 META-INF/spring/xxxx.imports:

Ⅳ、功能测试:

  • 配置文件(application.yml)

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第64张图片

  • 测试方法:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第65张图片

  • Postman测试:

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第66张图片

四、Web后端开发总结

1、三层架构

web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第67张图片

在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。

如果我们在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:我们要进行统一的登录校验,我们要进行统一的字符编码等这些操作时,我们就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第68张图片

而为了实现三层架构层与层之间的解耦,我们学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入

所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。

而DI依赖注入指的是容器为程序提供运行时所需要的资源。

除了IOC与DI我们还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第69张图片

我们在学习这些web后端开发技术的时候,我们都是基于主流的SpringBoot进行整合使用的。而SpringBoot又是用来简化开发,提高开发效率的。像过滤器、拦截器、IOC、DI、AOP、事务管理等这些技术到底是哪个框架提供的核心功能?

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第70张图片

  • Filter过滤器、Cookie、 Session这些都是传统的JavaWeb提供的技术。
  • JWT令牌、阿里云OSS对象存储服务,是现在企业项目中常见的一些解决方案。
  • IOC控制反转、DI依赖注入、AOP面向切面编程、事务管理、全局异常处理、拦截器等,这些技术都是 Spring Framework框架当中提供的核心功能。
  • Mybatis就是一个持久层的框架,是用来操作数据库的。

在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,我们也称为:SpringMVC

【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)_第71张图片

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

外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。

基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。

你可能感兴趣的:(#,Java,Web,--,黑马,Java,Web,SpringBoot)