spring boot的自动装配是通过几个核心注解实现的,@SpringbootApplication注解的底层代码中我们可以了解到有关自动配置的实验原理。包括@Configuration、@EnabledAutoConfiguration、@ConditionOnClass几大核心注解,在具体实施中,@EnableAutoConfuratuin会在我们Pom.xml配置导入的依赖中找到spring-boot-autoConfigure中的META-INF下面的spring-factories,将其中存在的类名以数组的形式返回到自动配置的实体类中进行过滤处理,再通过个自动配置类及自己的properties文件进行自动配置。
理解:
首先,我们在使用springboot时,需要对我们的对象新的类用@SpringBootApplication注解驱动,将该类标识为springboot的配置类,再通过springbootApplication的run方法,在执行过程中,springboot会导入相应的包并进行相关的注解驱动,过滤掉一些不满足条件的包。
我们可以点击@SpringBootApplication查看源代码,可以看到除了一些Target、Retent之类的元注解外,还有三个核心的注解,分别是SpringBootApplication将该类标识为配置类, ComponentScan自动扫描和EnableAutoConfiguration,其中EnableAutoConfiguration又包含AutoConfigurationPackage和Import,AutoConfigurationPackage中含有一个管理Bean对象的方法BeanDefinition,他会找到配置文件所在的包的位置并进行扫描,所以说配置文件的位置十分重要,关系到我们是否能够扫描到Controller等类的Bean对象,Import经过代码追踪到META-INF下面的spring-factories,里面存的全是可能要用的包的String类型的名字,将这些名字装在数组中,并在AutoConfigurationEntry方法下经过一系列操作,将重复导入的包名和我们不想用到的包名删掉,作为要自动配置的实体返回,通过反射机制将实体数组中代表的具体资源包进行下载,我们可以通过断点,来debug测试在过滤之前看看加载了多少包名,再看下过滤之后有多少包名,对于我们想要手动移除的类的,可以通过在配置类的@SpringBootApplication()中通过exclude A.class设置。一般来说,在spring-factories中是没有重复的包名的,而且一般来说我们在用springboot开发时也不会手动移除类,大多数类都是由Filter过滤的,在每个包名的底层中,都存在要满足的条件才不会被filter过滤掉,比如ConditionOnClass、ConditionOnBean等等,满足所有条件后才会生效,同时在springboot中也支持提供修改参数的方式,我们在Application.xml进行参数设置,一般通过前缀名.属性名进行设置。
总结,就是在spring-factories中有很多包名,以字符数组的形式返回到自动配置实体的方法中进行过滤,通过反射加载,如果由我们要用到但是被filter过滤掉的,我们在pom.xml导入相应的依赖,在涉及参数的修改时用前缀名加属性名在application.xml中配置,如端口号的配置,字符类型的设置。
更多推荐
面试题心得--SpringBoot中自动配置的原理是什么?
发布评论