SpringBoot自动装配原理


SpringBoot自动装配原理解析: 

 注解结构:

  

 

入口点:SpringBoot的引导类有如下内容:
@SpringBootApplication public class Application {     public static void main(String[] args) {       SpringApplication.run(Application.class,args);    } }

 

@SpringBootApplication注解:

进入@SpringBootApplication的注解类,会发现@SpringBootApplication是一个组合注解,在所包含的注解中重点要
关注如下三个注解:@SpringBootConfifiguration、@EnableAutoConfifiguration、@ComponentScan

  代码示例:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = {     @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),     @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { ..... }

 

@SpringBootConfifiguration注解:

代码实例:

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
经过查看会发现在该注解类上有一个大家比较熟悉的注解@Confifiguration,该注解是用来标识某一个类为Spring的
一个配置类,所以@SpringBootConfifiguration和@Confifiguration注解的作用一样,但是SpringBoot更推荐使用
@SpringBootConfifiguration.
 
 

@EnableAutoConfifiguration注解:

代码示例:

1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @AutoConfigurationPackage 6 @Import(AutoConfigurationImportSelector.class) 7 public @interface EnableAutoConfiguration { 8   ...... 9 }
经过查看可发现@EnableAutoConfifiguration也是一个组合注解,其中有两个注解需要重点理解下,如
@AutoConfifigurationPackage和@Import
 

@AutoConfifigurationPackage注解:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { }
经过查看可发现该注解通过@Import引入了一个Registrar.class类,那么该类实现了什么功能?在Registrar类中的
registerBeanDefifinitions方法上打个断点,debug启动后,会发现该类主要是加载@SpringBootApplication注解所
在类的包结构,并进行存储,为后期SpringBoot加载资源提供一个扫描的包路径。
 
 
 

@Import(AutoConfifigurationImportSelector.class)

上述@Import注解引入了一个类AutoConfifigurationImportSelector.class,读取该类的源代码会发现,SpringBoot启
动所在的装配类都在该注解类所在项目的META-INF/spring.factories文件中读取
 
 
通过debug启动后,会发现默认情况下会加载109个自动装配类,刚好对应的是spring.factoires文件中的自动装配类 的数量
 
 
 
META-INF/spring.factories中的内容
 
 
 

自动装配类解析:

我们可以从中抽取一个类,如:
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
打开DispatcherServletAutoConfifiguration看看如下:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass(DispatcherServlet.class) @AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class) @EnableConfigurationProperties(ServerProperties.class) public class DispatcherServletAutoConfiguration { ...... }  

 

上面的是关于DispatcherServletAutoConfifiguration的定义,通过源码我们发现在这个类上定义了好几个注解,其中:
@Confifiguration
@Bean 这两个注解的作用就是在Spring容器中将需要用到的Bean对象进行创建。
@AutoConfifigureOrder
@AutoConfifigureAfter
@AutoCOnfifigureBefore这三个注解,主要是指定当前类自动装配的顺序和时机。
@ConditionalOnWebApplication :这是一个条件注解,当前项目是web环境的条件下
@ConditionalOnClass:当前类路径下有指定的类的条件下。
分析完这些注解我们应该能明白的是sprinboot中的自动配置其实是使用这些条件注解来完成,当满足指定条件后就 可以自动进行配置

常见的条件注解:

@ConditionalOnBean          当容器中存在指定bean的条件下
@ConditionalOnClass         当类路径下存在指定类的条件下
@ConditionalOnMissingBean     当容器中不存在指定bean的条件下
@ConditionalOnMissingClass    当类路径下不存在指定类的条件下
@ConditionalOnProperty       指定的属性是否存在指定的值
@ConditionalOnResource       类路径下是否有指定的值
@ConditionalOnWebApplication   是web环境的条件下下
@ConditionalOnNotWebApplication 不是web环境的条件下

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM