• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

详解SpringBoot简化配置分析总结

springboot 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

在SpringBoot启动类中,该主类被@SpringBootApplication所修饰,跟踪该注解类,除元注解外,该注解类被如下自定注解修饰。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

让我们简单叙述下它们各自的功能:

  • @ComponentScan:扫描需要被IoC容器管理下需要管理的Bean,默认当前根目录下的
  • @EnableAutoConfiguration:装载所有第三方的Bean
  • @SpringBootConfiguration 作用等同于@Configuration

我们来看下@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
 @AliasFor(
  annotation = Configuration.class
 )
 boolean proxyBeanMethods() default true;
}

可以看到该注解类内包含与@Configuration,其作用与@Configuration并无太大区别,只是多了层属性嵌套。

故: @SpringBootConfiguration + @ComponentScan

将根目录下所有被**@Controller、@Service、@Repository、@Component**等所修饰的类交给IoC容器管理。

那么重点来了,@EnableAutoConfiguration是如何装载第三方Bean的呢?让我们跟踪下它的源码。

首先我们可以看到该类被如下注解修饰:

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

我们先关注下AutoConfigurationImportSelector这个组件。

// 批量导入第三方的一些Bean
@Import({AutoConfigurationImportSelector.class})

其中该组件的selectImports(AnnotationMetadata annotationMetadata)方法,我们先简述下它的作用:扫描所有需要被管理的第三方Bean并交给IoC容器进行管理。然后我们接着往下追踪。

public String[] selectImports(AnnotationMetadata annotationMetadata) {
 if (!this.isEnabled(annotationMetadata)) {
  return NO_IMPORTS;
 } else {
  // 让我们跟踪到这个方法
  AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
  return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
 }
}
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
 if (!this.isEnabled(annotationMetadata)) {
  return EMPTY_ENTRY;
 } else {
  AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
  // 获取所有AutoConfiguration的配置类
  List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
  // 下面就是对AutoConfiguration的去重、排除和过滤等操作
  configurations = this.removeDuplicates(configurations);
  Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
  this.checkExcludedClasses(configurations, exclusions);
  configurations.removeAll(exclusions);
  configurations = this.getConfigurationClassFilter().filter(configurations);
  // 我们继续追踪这里
  this.fireAutoConfigurationImportEvents(configurations, exclusions);
  return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
 }
}
private void fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions) {
 List<AutoConfigurationImportListener> listeners = this.getAutoConfigurationImportListeners(<em>本文来源gao.dai.ma.com搞@代*码(网$</em>);
 if (!listeners.isEmpty()) {
  // 加了层包装
  AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, configurations, exclusions);
  Iterator var5 = listeners.iterator();

  while(var5.hasNext()) {
   AutoConfigurationImportListener listener = (AutoConfigurationImportListener)var5.next();
   this.invokeAwareMethods(listener);
   // 向ConditionEvaluationReport中导入所有AutoConfiguration
   listener.onAutoConfigurationImportEvent(event);
  }
 }

}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:详解SpringBoot简化配置分析总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址