アウトライン
SpringBootの規約は設定よりも大きくなっている私は記事を書いた前に、レッツは感動スキルの「SpringMVCにSpringBootから」
SpringBootとSpringMVCこれら2つのフレームワークと比較されてきたが、SN比とコードを使用することの難しさにエンドSpringBoot超高信号で私たちを聞かせて画像深いです。
しかし、最終的には、関係なく、アプリケーションや自然のSpringBoot SpringMVCは、Springベースのアプリケーションのままですが、後者の顔にそれの謎のベールに覆われて!
戻るSpringBootトピックは、SpringBootベースのアプリケーションの開発では、我々は、水にアヒルだけのJavaEE開発に、正式に、その存在の、いくつかの新しいノートやクラスを使用しています。私たちは、ほとんどを使用することをコメントの一つは、SpringBootアプリケーション起動時クラスに間違いだった@SpringBootApplication注釈付き
この記事では最後にそれを見ていきますGeshaです!
最後に@SpringBootApplication背後に何ですか?
@SpringBootApplicationコメントは、私たちはそのソースコードを見てみましょう実際にSpringBootが提供する複合注釈です。
@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 { ... }
私は、複合体である、はっきりと見るが、最も重要なのは3つのノートです。
-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
我々はそれを呼ぶかもしれない「三体構造」、それの!
我々は、スタートアップクラスSpringBootアプリケーション・ノートの3冊のノートが見つかった@SpringBootApplicationのこの場所を気にしていない場合は問題ではありません。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class TestSpringBootApplication { ... }
ここではどのような影響これらのアノテーションを3分析しています!
@SpringBootConfiguration
それは、コードは次のように書かれているコードを見てください:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
これは、両方の機能は、クラス構成、現在のクラスおよび容器に注入例えば@Bean srpingコメントタグの方法と現在のクラスとしてマークされ、@SpringBootConfiguration @Configurationから説明され、インスタンス名は、メソッドの名前です。
@Configurationとして、私は非SpringBootの時代に私たちはあなたに不慣れであってはならないと思いますが、それはSpringコンテナ、クラスによって使用される構成の、すなわち春のIoCコンテナJavaConfigフォームを設定することです。
現在の状況に、何も新しいものを持っていないようです!!!
@EnableAutoConfiguration
次のようにし、コードを見ていき、コードは次のとおりです。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { ... }
@EnableAutoConfigurationコメントは自動設定を有効にする、それがグラフィカルに示し、以下に簡単にすることができ、現在のIoCコンテナにロードされるSpringBootは、すべての適格@Configuration構成に適用することができます:
次に、我々はこのプロセスを説明するために、ソースコードを制御します。
- で@EnableAutoConfiguration AutoConfigurationImportSelectorのヘルプ、および実装することで、後者selectImportsを()の導出の設定方法に
- 内部のスプリングコアパッケージを呼び出してAutoConfigurationImportSelectorクラスselectImports()メソッドSpringFactoriesLoaderクラスloadFactoryNames()メソッド
- 最终通过 SpringFactoriesLoader.loadFactoryNames() 读取了 ClassPath 下面的 META-INF/spring.factories 文件来获取所有导出类。
而spring.factories 文件里关于 EnableAutoConfiguration 的配置其实就是一个键值对结构,样子大概长下面这样:
说了这么多,如果从稍微宏观一点的角度 概括总结 上述这一过程那就是:
从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。
@ComponentScan
@ComponentScan 对应于XML配置形式中的 <context:component-scan>,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:
- @Controller
- @Entity
- @Component
- @Service
- @Repository
等等
对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:
@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})
可见 这个注解也并不是什么新东西!