ホームページ  >  記事  >  Java  >  SpringBoot自動構成の実装方法

SpringBoot自動構成の実装方法

WBOY
WBOY転載
2023-05-12 14:31:121199ブラウズ

    springboot の実装方法

    前の helloworld の例では、springboot が依存関係を自動的にインポートして完了する簡単さを最初に体験しました。構成。 。

    それでは、springboot はどのように実装されるのでしょうか?

    1. 依存関係管理機能

    まず、前のコンテンツ例の pom.xml を確認してください:

    <!--导入父工程-->
      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.3.4.RELEASE</version>
      </parent>
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>

    ここには親プロジェクトが追加されており、インポートされるのは 1 つだけです。 spring-boot-starter-web に依存して、すべての関連パッケージが最終的に導入されます。

    SpringBoot自動構成の実装方法

    プロセス全体を通じて、パッケージの導入の問題について心配する必要はありません。

    1. 親プロジェクト

    すべての springboot プロジェクトには親プロジェクトがあり、通常は依存関係の管理に使用されます。

    親プロジェクトは多くの依存関係を宣言する可能性があるため、サブプロジェクトが親プロジェクトを継承している限り、後で依存関係を追加するときにバージョン番号を追加する必要はありません。

    上記を例にとると、親プロジェクトは Springboot バージョンの 2.3.4.RELEASE を使用しているため、以下に追加する依存関係のバージョン番号を記述する必要はありません。

    (1) 親プロジェクトによるバージョン管理方法

    Ctrl キーを押しながら親プロジェクトをクリックすると確認できます。

    SpringBoot自動構成の実装方法

    #入社後、彼が親プロジェクトの spring-boot 依存関係も持っていることがわかりました。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.3.4.RELEASE</version>
      </parent>

    spring-boot-dependency の入力を続けると、以下のプロパティ タグが表示されます:

    SpringBoot自動構成の実装方法

    これは、開発におけるすべての可能性をほぼ宣言しています。使用される jar パッケージのバージョン。

    Continue down to see the specific dependency Management dependencyManagement. ここで引用されているバージョンは、プロパティで宣言されているバージョンです。

    SpringBoot自動構成の実装方法

    例:

    左側に logback というパッケージがあったので、中を検索したところ、ここで定義されているバージョンは 1.2.3 であることがわかりました。

    SpringBoot自動構成の実装方法

    つまり、親プロジェクトの主な機能は依存関係管理であり、開発で一般的に使用される依存関係のバージョン番号をほぼ宣言します。

    (2) 指定バージョンを使用する

    自動調停バージョンを使用したくない場合は、指定バージョンを使用することもできます。

    たとえば、mysql のバージョンの場合、自動調停の結果は 8.0.21 ですが、バージョン 5.1.43 のみを使用したいと考えています。

    SpringBoot自動構成の実装方法

    #プロパティ タグを追加し、その中でバージョンを宣言します。

    <properties>
          <mysql.version>5.1.43</mysql.version>
      </properties>

    インポートされた依存関係を再度確認すると、指定されたバージョンになっています。

    SpringBoot自動構成の実装方法

    2. シナリオ スターター
    最初にインポートされた依存関係 spring-boot-starter-web:

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

    を見てみましょう。将来的には、spring-boot-starter という名前のスターターがさらに増える予定です。公式ドキュメントにも詳細な手順が記載されています

    SpringBoot自動構成の実装方法

    スターターとは何ですか?

    starter は依存関係の説明のセットです。つまり、通常はスターターを導入するだけで、対応する開発シナリオ全体が導入されます。

    たとえば、データベース アクセスに Spring と JPA の使用を開始する場合は、プロジェクトに spring-boot-starter-data-jpa 依存関係を導入します。

    さらに、ここでの spring-boot-starter-* は公式のスターター命名方法であることに注意してください。

    つまり、非公式のものはまだあるのでしょうか?はい、公式のスターター シナリオではまだニーズを満たせないと思われる場合は、スターターをカスタマイズできます。

    ただし、公式の推奨事項は、カスタマイズされた名前付けに thirdpartyproject-spring-boot-starter を使用することです。

    なぜ 1 つのスターターだけがシーン全体の依存関係をインポートできるのかというと、これは実際には上記の親プロジェクトと同じ Maven の依存関係機能です。

    spring-boot-starter-web と入力し、下にスクロールすると、Web シナリオの開発で使用される依存関係が表示されます。

    SpringBoot自動構成の実装方法

    #したがって、今後どのシナリオを開発する必要があるかは、公式ドキュメントを参照して、対応するランチャーをインポートするだけです。

    2. 自動構成

    前の helloworld プロジェクトで Springboot が自動的に構成したものを確認してみましょう:

    • Tomcat を自動的に構成する

    • springMVC を自動的に構成する

    • #次のような一般的な Web 関数を自動的に構成する: 文字エンコードの問題
    • 默认的包结构:主程序所在包以及下面所有子包里的组件都会被默认扫描

    • 各种配置拥有默认值

    • 按需加载所有自动配置项

    • ......

    1. 自动配置组件

    不管自动配置好什么,步骤都是:先引入、再配置。

    比如 tomcat,那么前提是先引入了 tomcat 依赖,这就由上面第一部分内容所讲的依赖管理完成,在引入了 web starter 后,自动引入场景。

    自动引入了场景,也就引入了这个场景下所用到的各种 jar 包,接下来就是要配置这些内容,比如 tomcat、springMVC 等等。

    拿 springMVC 举例,在之前要使用 springMVC,肯定要配置DispatcherServlet,帮我们拦截所有请求。

    <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springMVC.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>

    现在看下之前的 helloworld 应用中,springboot 是在哪里帮我们做好配置的。

    先看主程序类:

    // 标记这是一个 springboot应用,这个类是主程序类,所有启动的入口
    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            SpringApplication.run(MainApplication.class, args);
        }
    }

    可以创建个本地变量(alt+enter),可以看到这个是个ConfigurableApplicationContext类型。

    SpringBoot自動構成の実装方法

    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        }
    }

    可以使用getBeanDefinitionNames()方法,查看里面包含了哪些容器,遍历打印出来。

    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            // 返回IOC容器
            final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
            // 查看容器里的组件
            final String[] beanDefinitionNames = run.getBeanDefinitionNames();
            for (String name: beanDefinitionNames) {
                System.out.println(name);
            }
        }
    }

    接下来启动应用,看下控制台输出。

    SpringBoot自動構成の実装方法

    在控制台输出里ctrl+F搜索下DispatcherServlet:

    SpringBoot自動構成の実装方法

    发现 IOC 容器中已经有了对应的组件。

    2. 默认的包结构

    主程序所在包以及下面所有子包里的组件都会被默认扫描,所以我们不需要配置开启组件扫描,也可以正常使用。

    但是要注意这里的范围:

    SpringBoot自動構成の実装方法

    示例中就是com.pingguo.boot包下以及所有子包都可以自动扫描。

    如果你就是要放到外面,还希望被扫描到,怎么办?

    那么可以使用主程序类中@SpringBootApplication注解中的一个属性scanBasePackages,扩大包的范围即可:

    @SpringBootApplication(scanBasePackages = "com.pingguo")
    public class MainApplication {
        public static void main(String[] args) {
    ... ...
    3. 各种配置拥有默认值

    比如 tomcat端口,在application.properties配置文件里使用 idea 输入的时候,就可以看到带有默认值8080:

    SpringBoot自動構成の実装方法

    点击进去可看到后面都是绑定了对应的 java 类。

    SpringBoot自動構成の実装方法

    配置文件的值最终会绑定在对应的类上,这个类会在容器中创建对象。

    4. 按需加载所有自动配置项

    比如应用中只引入了spring-boot-starter-web,那么就只有web场景的自动配置才会开启。

    springboot 中的所有自动配置,都在这里:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>2.3.4.RELEASE</version>
        <scope>compile</scope>
      </dependency>

    点击spring-boot-starter-web可以找到spring-boot-starter,再进入其中就可以看到spring-boot-autoconfigure。

    以上がSpringBoot自動構成の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。