探索SpringBoot基础注解
@SpringBootApplication
springboot应用当中,此注解如果标注在某个类上,则说明这个类是spring boot的主配置类,spring boot就应该运行这个类的main方法来启动spring boot应用。
需要注意的是,@SpringBootApplication 其实是组合注解。
现在重点介绍一下其中的两个注解:@SpringBootConfiguration和 @EnableAutoConfiguration
@SpringBootConfiguration
这个注解是spring boot的配置类,标注在某个类上,表示这是一个spring boot的配置类。
点击SpringBootConfiguration(ctrl+左键),进入后会发现其底层是Spring的Configuration注解。这里的配置类即为配置文件,而SpringBoot是如何知道这个类是配置类呢,这主要是是通过Configuration注解进行识别。
@EnableAutoConfiguration
开启自动配置功能。
以前我们需要配置的东西现在都不需要,现在是SpringBoot来进行配置。那自动配置究竟是怎样的一个原理呢?这主要是依靠其下的@AutoConfigurationPackage注释等实现的。
我们点击@EnableAutoConfiguration(ctrl+左键),进入如下界面:
@AutoConfigurationPackage
自动配置包。
我们点进去再看看,发现是@Import({Registrar.class}),这仍然是spring的底层注解!
@Import
给容器中导入一个组件,由导入的组件来说明需要导入哪些组件。
我们再点击Registrar.class(仍然是ctrl+左键,这个小技巧很方便!)进入后,我们发现其中有一个registerBeanDefinitions()方法。其中的一个参数是metadata,它也是这个注解的原信息。
我们可以设置断点debug一下,看看其包含着什么信息。
首先我们可以看到它是个springbootApplication注解(类型),其次我们可以看到这个注解是作用在DemoApplication这个类上的(作用范围)
由于registerBeanDefinitions()方法里面还有new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames(),即获取当前项目的报名,我们可以计算一下包名:
我们发现这个包名就是当前这个配置类所在的包的名字:
于是我们知道,将主配置类的所在包及下面所有子包里面的所有组件扫描到spring容器(重要!!)
当然我们还要注意的是,在EnableAutoConfiguration中还有一个import,即导入AutoConfigurationImportSelector.class,其含义为:导入哪些组件的选择器。
我们再点击进入看看需要导入哪些组件。其中有一个方法如下:
我们不难看出,AutoConfigurationImportSelector是将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。
我们仍可以debug看看其作用在哪个类上:
另外,我们还可以对getAutoConfigurationEntry方法进行debug:
需要额外关心的是configurations,在最后的返回结果中,我们可以看看其中包含了哪些信息:
其中包含着众多的xxxxAutoConfiguration,其实这就是给容器中导入这个场景需要的所有组件,并且配置好这些组件。有了自动配置类,我们就能免去手动编写配置注入功能组件等工作。
那这些自动配置类是怎么扫描到的呢?其实是在getAutoConfigurationEntry方法中有如下的方法:getCandidateConfigurations(annotationMetadata, attributes),即获取候选的配置文件。
点击进入这个方法后,有如下这个方法:SpringFactoriesLoader.loadFactoryNames()
这个方法有2个参数:getSpringFactoriesLoaderFactoryClass()和getBeanClassLoader()
第一个参数getSpringFactoriesLoaderFactoryClass()的值,它返回了EnableAutoConfiguration.class
第二个参数getBeanClassLoader()的值,它返回了beanClassLoader
我们再看看loadFactoryNames()方法本身:
这个方法实际上就是从META-INF/spring.factories 这个资源里面获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置就生效,于是帮助我们进行自动配置。以前我们需要自己配置的东西,自动配置类都帮我们配置好了。当然我们也可以在导入的jar包中查看factories:
J2EE的整体整合解决方案和自动配置都在这个包里,真是个spring boot的大整合!