1.spring boot是为了简化spring的,而不是增强spring,它是spring全家桶中的一员。springboot约定大于配置以及开箱即用
2.spring boot是如何进行自动包扫描?为什么需要将文件放在启动类所在包及子包才能被springboot自动扫描并注册bean?
(一)推测
spring boot会扫描启动类所在的包以及子包中加入@Controller @Service @Component @Respository的类
并将其加入到ioc容器
(二)分析源码
a.@SpringBootApplication这是源码中的一个非常重要的注解
b.分析@SpringBootApplication注解:
1.@SpringBootApplication是一个组合注解,包含几个元注解,以及三个非常重要的注解
{@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan}
元注解:@Target(ElementType.TYPE) //注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期
@Documented //表明这个注解应该被javadoc记录
@Inherited //子类可以继承该注解
2.@SpringBootConfiguration注解是指当前类是注解类
3.@EnableAutoConfiguration注解是指开启自动配置,点开后看@AutoConfigurationPackage这个注解,它是指自动配置包
4.@AutoConfigurationPackage这个注解,主要通过@Import注解引入了AutoConfigurationPackages.Registrar.class这个类
5.Registrar.class这个类主要调用了register(registry, new PackageImport(metadata).getPackageName());这个方法
6.分析参数传了BeanDefinitionRegistry 变量,和一堆包名组成字符串;
最后一行调用registry.registerBeanDefinition(BEAN, beanDefinition)就是将
new PackageImport(metadata).getPackageName());这个方法
得到的包名下所有文件扫描并将其下文件分析并注册bean,
这样就是大体流程,接下来调试源码验证一下。
3.spring boot是如何封装spring众多的配置类?
(一)推测
spring boot会自动的将一些配置类的bean注册进ioc容器,并且spring boot应该有大量的配置类的信息
(二)分析源码
a.@SpringBootApplication这是源码中的一个非常重要的注解
b.分析@SpringBootApplication注解:
1.@SpringBootApplication是一个组合注解,包含几个元注解,以及三个非常重要的注解
{@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan}
元注解:@Target(ElementType.TYPE) //注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期
@Documented //表明这个注解应该被javadoc记录
@Inherited //子类可以继承该注解
2.@SpringBootConfiguration注解是指当前类是注解类
3.@EnableAutoConfiguration注解是指开启自动配置,点开后看@Import(AutoConfigurationImportSelector.class)这个注解
它的意思就是:使用Import自动导入所有符合自动配置条件的Bean定义并加载到IOC容器
4.点开AutoConfigurationImportSelector类中找到getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes)方法里面有一行List configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());我们进行调试就会扫描到org.spring......../MEAT-INF/spring.factories文件
得到所有的配置类并且初步筛选出124个配置类
5.getAutoConfigurationEntry()这个方法层层执行,去重,移除,过滤,返回最后的你所需要的配置类
6.我们可以手动查看org.spring......../MEAT-INF/spring.factories文件中一些配置类的重要注解(比如RabbitTemplate这个配置类):
@Configuration标注这个类是一个配置类。
@ConditionalOnClass(RabbitTemplate.class):判断当前classpath下是否存在RabbitTemplate,若是则将当前的配置类装载入spring容器。
@ConditionalOnBean(RabbitTemplate.class):判断当前spring的applicationContext中是否存在RabbitTemplate,若是则将当前的配置类装载入spring容器。
@ConditionalOnMissingBean()这个配置是指如果满足条件,当前配置类不被加载进ioc容器
@EnableConfigurationProperties()通过这个注解我们可以找到这个配置类的配置文件
@ConfigurationProperties(prefix = "spring.cache")通过这个注解我们可以在
xxxxx.properties这个配置文件中去手动的配置我们所需要的配置类,以及修改配置类的属性