一、起步依賴
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) { //此處為具體判斷方法,代碼省略 }