初识Springboot
一、Springboot是什么
1、springboot是一种服务于框架(spring)的框架,以“约定优于配置”的理念去简化项目的搭建和开发,它的服务范围是简化配置文件。
二、约定优于配置指的是什么
“约定优于配置”指的是大家都以事先定好的规则去开发,好比:条条大路通罗马,大家可以走不同的路线,但是这样会造成,当大家进行合作的时候,无从下手。而事先约定好大家一起走固定的一条路线,这样便于合作。
“约定优于配置”具体体现在:
1、maven的目录结构都是固定的(默认以jar的方式打包/默认会有resource文件夹);
2、spring-boot-starter-web等,提供开箱即用的内置组件(内置tomcat、resource/{template/static});
3、默认使用application.properties等配置文件
三、@SpringBootApplication由哪几个注解组成,这几个注解分别表示什么作用
@SpringBootApplication是一个复合注解。它包括几个部分:
1、@Target
2、@Retention
3、@Documented
4、@Inherited
5、@SpringBootConfiguration
6、@EnableAutoConfiguration
7、@ComponentScan
其中,@Target、@Retention、@Documented、@Inherited是属于java的元注解(用于注解【注释】的注解就称为元注解),他们四个主要描述作用范围,生命周期等信息。
所以本质上,@SpringBootApplication主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解组成。
1、@SpringBootConfiguration(本质上就是@Configuration注解):任何一个标注了@Configuration 的 Java 类定义都是一个JavaConfig 配置类。而在这个配置类中,任何标注了@Bean 的方法,它的返回值都会作为 Bean 定义注册到Spring 的 IOC 容器,方法名默认成为这个 bean 的 id;
2、@EnableAutoConfiguration:EnableAutoConfiguration 的 主 要 作 用 其 实 就 是 帮 助springboot 应用把所有符合条件的@Configuration 配置都加载到当前 SpringBoot 创建并使用的 IOC 容器中
3、@ComponentScan:@ComponentScan的主要作用就是扫描指定路径下的标识了注解需要装配的类,自动装配到 spring 的 IOC容器中。
四、springboot自动装配的实现原理
1.SpringApplication.run(StudyApplication.class, args);在run方法中必须要传入一个被@SpringBootApplication注解的类。而@SpringBootApplication是一个复合注解,其中有@EnableAutoConfiguration注解,
这个注解主要是用来开启自动配置的功能这个注解下面,有@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)
先看看@AutoConfigurationPackage注解:这个注解是自动配置包,主要是使用的@Import来给Spring容器中导入一个组件 ,这里导入的是Registrar.class。来看下这个Registrar:就是通过这个方法获取扫描的包路径,可以debug看看:在这行代码上打了一个断点:
启动项目:
进入断点处:
看看能否获取扫描的包路径:已经获取到了包路径:
那那个metadata是什么呢:
可以看到是标注在@SpringBootApplication注解上的DemosbApplication,也就是我们的主配置类:
说白了就是将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载到Spring容器。所以包名一定要注意。
现在包扫描路径获取到了,那具体加载哪些组件呢,看看下面这个注解
@Import({AutoConfigurationImportSelector.class})
@Import注解就是给Spring容器中导入一些组件,这里传入了一个组件的选择器:AutoConfigurationImportSelector。里面有一个selectImports方法,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。
给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件:有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。
那他是如何获取到这些配置类的呢,看看上面这个方法:
会从META-INF/spring.factories中获取资源,然后通过Properties加载资源:Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了
五、spring中的spi机制的原理是什么?
service provider interface JDK内置的中服务发现机制。
我们知道在SprngBoot中好多的配置和实现都有默认的实现,我们只需要修改部分配置,比如数据库配置,我们只要在配置文件中写上对应的url,username,password就可以使用了。其实他这边用的就是SPI的方式实现的,不过Spring使用的只是和JDK中的原理相同而已。
JDK使用的工具类是ServiceLoader;Spring中使用的类是SpringFactoriesLoader,在org.springframework.core.io.support包中
区别:
1、文件路径不同 spring配置放在 META-INF/spring.factories中
2、具体的实现步骤不一样,不过原理相同,都是使用的反射机制
服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了。