SpringBoot的原理和注解功能配置

40 阅读3分钟

一.SpringBoot相较于Spring原始框架(SpringFramework)的区别

SpringBoot是对SpringFramework的优化,底层还是基于SpringFramework的

1.依赖管理

在原始框架SpringFramework(下文称Framework)中,我们需要在pom.xml里,自行寻找并导入海量的依赖,并且要仔细辨别各依赖的版本,避免互相冲突

而在SpringBoot(下称Boot)中,我们有了官方提供的起步依赖.

当引入spring-boot-starter-web后,Maven会根据依赖传递的特性,为我们自动导入web开发的常用依赖.

2.自动配置

在Framework里,我们需要不胜其烦的为Bean做声明和配置,极大的提高了学习成本和开发难度.

而在Boot中,我们可以通过自动装配,自动配置来帮助我们完成Bean的声明和配置.

在启动Spring的时候,常用的各配置类Bean对象就自动存入了IOC容器,省去了繁琐的操作.

二.Bean的管理

1.@Scope

singelton:默认值,单例

prototype:原型,多例

  • 默认 singleton 的 bean,在容器启动时被创建,可以使用 @Lazy 注解来延迟初始化(延迟到第一次使用时)
  • prototype 的 bean,每一次使用该 bean 的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的 bean 是单例的,也就是说绝大部分 bean 不需要配置 scope 属性。

2.第三方的

加在方法上

默认 BeanName 为方法名字,可以通过 value 属性手动指定 beanName

形参可以完成注入

  • 通过 @Bean 注解的 name 或 value 属性可以声明 bean 的名称,如果不指定,默认 bean 的名称就是方法名。
  • 如果第三方 bean 需要依赖其他 bean 对象,直接在 bean 定义方法中设置形参即可,容器会根据类型自动装配。

三.SpringBoot的注解

1.Application注解

1.1 SpringBootConfiguration,

底层是一个Configuration,表示启动类也是一个配置类,可以在内部定义相关Bean

1.2 ComponentScan,

表示组件扫描,默认会扫描启动类包及子包下Spring能识别的组件

1.3 EnableAutoConfiguration,

底层是一个Import注解,该注解中导入 AutoConfigurationImportSelector类,该类中有一个selectImports 方法会被调用,该方法最终会去加载

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件中的内容,并筛选满足starter和各种Conditional条件的全类名,封装成一个字符串数组加载到内存中

2.Run方法

启动类会通过run方法去创建与初始化Spring容器,在初始化时会把上面注解加载到内存中的字符串数组对应的内容,创建成对象注入到Spring容器,至此就完成了自动化装配

四.自定义starter

1.定义一个xxx-boot-starter

只负责管理依赖,导入下面的autoconfigure依赖,不写代码

2.定义一个xxx-boot-autoconfigure

完成功能代码 定义一个XxxAutoConfiguration 类完成bean的创建和注入 通过的Spring自动化装配原理完成XxxAutoConfiguration 类的初始化操作

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件中增加 XxxAutoConfiguration的全类名