SpringBoot起步依賴和自動配置


 

一、起步依賴

1. 是什么

本質上是一個Maven項目對象模型(Project Object Model, POM), 定義了對其他庫的傳遞依賴,這些東西加在一起即支持某項功能。 比如:

  • spring-boot-dependencies
  • ^ spring-boot-parent
  • ^ spring-boot-starters
  • ^ spring-boot-starter-web

spring boot起步依賴的名字具有很大的可讀性,一般見到名字就知道其功能。 使用起步依賴 = 起步依賴+依賴的傳遞依賴(注意:這些依賴的版本是確定好了的, 經過實踐驗證的可用的,自己不需要再添加), 可以通過$ mvn dependency:tree查看依賴樹。

2. 怎么用

<!--添加web起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--排除不需要的傳遞依賴--> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> </exclusions> </dependency> <!--如果想加其他依賴,直接再加dependency元素 如果起步依賴包括想要加的依賴,但是版本與想使用的版本不同, 可以先排除掉老的依賴,再加dependency元素添加新依賴。 Maven傾向於使用最近的依賴,Gradle傾向於使用庫的最新版本。 -->

二、自動配置

1. 是什么

Spring Boot的自動配置是應用程序啟動時,spring boot框架自動檢測 classpath里的Bean來進行配置的一種機制。

2. 怎么用

通過在配置類里使用@EnableAutoConfiguration 或者@SpringBootApplication注解 開啟組件掃描和自動配置。 通過@SpringBootApplication的exclude參數關閉特定 的自動配置。@SpringBootApplication(exclude = XAutoConfiguration.class)

3. 怎么實現的

(參考《JavaEE開發的JavaEE開發的顛覆者-SpringBoot實戰》一書)

源碼可以查看spring-boot-autoconfigure-1.5.6.RELEASE.jar包

1).@EnableAutoConfiguration注解

@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * Exclude specific auto-configuration classes such that they will never be applied. * @return the classes to exclude */ Class<?>[] exclude() default {}; /** * Exclude specific auto-configuration class names such that they will never be * applied. * @return the class names to exclude * @since 1.3.0 */ String[] excludeName() default {}; }

這里起關鍵作用的是@Import注解導入的配置功能。 EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames 方法來掃描具有META-INF/spring.factories文件里的jar包,spring.factories文件中聲明了 有哪些自動配置。 打開AutoConfiguration的Java源文件,可以看到有 @ConditionalOnClass @ConditionalOnBean @ConditionalOnMissingBean @ConditionalOnJava 等這些注解

這些注解都是組合了@Conditional元注解,例如@ConditionalOnWebApplication注解:

@Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(OnWebApplicationCondition.class) public @interface ConditionalOnWebApplication { }

進一步可以看看OnWebApplicationCondition條件是怎么構造的:

@Order(Ordered.HIGHEST_PRECEDENCE + 20) class OnWebApplicationCondition extends SpringBootCondition { private static final String WEB_CONTEXT_CLASS = "org.springframework.web.context." + "support.GenericWebApplicationContext"; @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { boolean required = metadata .isAnnotated(ConditionalOnWebApplication.class.getName()); ConditionOutcome outcome = isWebApplication(context, metadata, required); if (required && !outcome.isMatch()) { return ConditionOutcome.noMatch(outcome.getConditionMessage()); } if (!required && outcome.isMatch()) { return ConditionOutcome.noMatch(outcome.getConditionMessage()); } return ConditionOutcome.match(outcome.getConditionMessage()); } private ConditionOutcome isWebApplication(ConditionContext context, AnnotatedTypeMetadata metadata, boolean required) { //此處為具體判斷方法,代碼省略 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM