1概要

今回の記事では、標準のSpringフレームワークとSpring Bootの違いについて説明します。

MVCやSecurityなど、Springのモジュールが、Springのコアで使用された場合とBootで使用された場合の違いについて説明します。

** 2春って何?

簡単に言うと、SpringフレームワークはJavaアプリケーションを開発するための包括的なインフラストラクチャサポートを提供します。

Dependency Injectionのような優れた機能と、次のようなすぐに使えるモジュールが満載です。

  • Spring JDBC

  • Spring MVC

  • 春のセキュリティ

  • 春のAOP

  • 春のORM

  • 春テスト

これらのモジュールはアプリケーションの開発時間を劇的に短縮することができます。

たとえば、Java Web開発の初期の頃は、レコードをデータソースに挿入するための定型コードをたくさん書く必要がありました。

しかし、Spring JDBCモジュールの

JDBCTemplate

を使用することで、わずかな設定で数行のコードに減らすことができます。


3 Spring Bootとは何ですか?

Spring Bootは基本的にSpringフレームワークを拡張したもので、Springアプリケーションの設定に必要な定型句の設定を排除しました。

  • より速く、より効率的な開発エコシステム** への道を切り開いたSpringプラットフォームの見解を取り入れています。

Spring Bootの機能のほんの一部です。

  • ビルドとアプリケーションを単純化するための「スターター」依存関係の意見

構成
** アプリケーション展開の複雑さを避けるための組み込みサーバー

メトリクス、Helthチェック、および外部設定

Spring機能のための** 自動設定 – 可能な限りいつでも

これら両方のフレームワークについて、順を追って説明しましょう。


4 Mavenの依存関係

まず最初に、Springを使ってWebアプリケーションを作成するのに必要な最小限の依存関係を見てみましょう。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

Springとは異なり、Spring BootはWebアプリケーションを起動し実行するために必要な依存関係は1つだけです。

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

他のすべての依存関係は、ビルド時に自動的に最終アーカイブに追加されます。

もう1つの良い例はライブラリのテストです。通常、Spring Test、JUnit、Hamcrest、およびMockitoの各ライブラリを使用します。 Springプロジェクトでは、これらすべてのライブラリを依存関係として追加する必要があります。

しかしSpring Bootでは、これらのライブラリを自動的に含めるためのテストにはスターター依存関係のみが必要です。

  • Spring Bootは、さまざまなSpringモジュールに対して多くのスターター依存関係を提供します。


  • ブートブートスターターデータjpa


  • ブートブートスターターセキュリティ


  • スプリングブートスターターテスト


  • boot-start-starter-web

  • スプリングブートスタータータイムスレッド__

初心者の完全なリストについては、https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-starter[Spring documentation]もチェックしてください。


5 MVC設定

SpringとSpring Bootの両方を使ってJSP Webアプリケーションを作成するために必要な設定を調べてみましょう。

  • Springでは、ディスパッチャサーブレット、マッピング、およびその他のサポート構成を定義する必要があります** これは、

    web.xml

    ファイルまたは

    Initializer

    クラスを使用して実行できます。

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.baeldung");

        container.addListener(new ContextLoaderListener(context));

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

また、

@ Enable

WebMvc

アノテーションを

@ Configuration__クラスに追加し、コントローラから返されたビューを解決するためのビューリゾルバを定義する必要があります。

@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer {
   @Bean
   public ViewResolver viewResolver() {
      InternalResourceViewResolver bean
        = new InternalResourceViewResolver();
      bean.setViewClass(JstlView.class);
      bean.setPrefix("/WEB-INF/view/");
      bean.setSuffix(".jsp");
      return bean;
   }
}

これらすべてと比較すると、Spring Bootには、Webスターターを追加した後で、物事をうまく機能させるために必要なプロパティがいくつか必要です。

spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp

  • 上記のすべてのSpring設定は、https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configurationというプロセスを通じて、Boot Webスターターを追加することによって自動的に含まれます。 html[自動設定]。**

つまり、Spring Bootはアプリケーションに存在する依存関係、プロパティ、およびBeanを調べ、それらに基づいて設定を有効にします。

もちろん、独自のカスタム設定を追加したい場合は、Spring Bootの自動設定は元に戻ります。

5.1. テンプレートエンジンの設定

SpringとSpring Bootの両方で

Thymeleaf

テンプレートエンジンを設定する方法を学びましょう。

Springでは、ビューリゾルバに

thymeleaf-spring5

依存関係といくつかの設定を追加する必要があります。

@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
}

Webアプリケーションで

Thymeleaf

サポートを有効にするには、Spring Boot 1は

__spring-boot-starter-thymeleafの依存関係のみを必要としました。しかし


Thymeleaf3.0の新機能のために、


weはSpring Boot 2 Webアプリケーションの依存関係として


thymeleaf-layout-dialect

__も追加する必要があります。

依存関係が整ったら、

src/main/resources/templates

フォルダーにテンプレートを追加すると、Spring Bootがそれらを自動的に表示します。


6. Springのセキュリティ設定

簡単にするために、これらのフレームワークを使用してデフォルトのHTTP基本認証がどのように有効になっているのかを説明します。

Springを使用してセキュリティを有効にするために必要な依存関係と設定を調べることから始めましょう。

  • Springは、アプリケーションでセキュリティを設定するために、標準の

    spring-security-web



    spring-security-config

    の依存関係** の両方を要求します。

次に、

WebSecurityConfigurerAdapter

を拡張し、

@ EnableWebSecurity

** アノテーションを使用するクラスを追加する必要があります。

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1")
            .password(passwordEncoder()
            .encode("user1Pass"))
          .authorities("ROLE__USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .anyRequest().authenticated()
          .and()
          .httpBasic();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

ここでは、認証を設定するために

inMemoryAuthentication

を使用しています。

同様に、Spring Bootも動作させるためにこれらの依存関係を必要とします。

ただし、**

spring-boot-starter-security

の依存関係のみを定義する必要があります。これにより、関連するすべての依存関係がクラスパスに自動的に追加されます。

Spring Bootのセキュリティ設定は上記と同じです。

JPA設定をSpringとSpring Bootの両方でどのように実現できるかを知る必要がある場合は、https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa[AガイドJPAへの春]。


7. アプリケーションブートストラップ

SpringとSpring Bootにおけるアプリケーションのブートストラップの基本的な違いはサーブレットにあります。 Springはブートストラップエントリポイントとして

web.xml

または____SpringServletContainerInitializerを使用します。

一方、Spring Bootはサーブレット3機能のみを使用してアプリケーションをブートストラップします。詳しく説明しましょう。


7.1. 春のブートストラップはいかがですか?

Springは、従来の

web.xml

ブートストラップ方法と最新のServlet 3メソッドの両方をサポートしています。


web.xml

アプローチを段階的に見てみましょう。

  1. サーブレットコンテナ(サーバ)は__web.xmlを読み込みます.


  2. web.xml

    に定義された

    DispatcherServlet

    は、次のインスタンスによってインスタンス化されます

コンテナ


DispatcherServlet

は、読み取りによって

WebApplicationContext

を作成します。


WEB-INF/\ {servletName} -servlet.xml

。最後に、

DispatcherServlet

は、で定義されたBeanを登録します。

アプリケーションコンテキスト

SpringがServlet 3+を使ってブートストラップする方法は次のとおりです。

  1. コンテナーはクラスを検索します


ServletContainerInitializer

を実装して実行する


SpringServletContainerInitializer

は、実装されているすべてのクラスを見つけます。


WebApplicationInitializer



WebApplicationInitializer

はXMLでコンテキストを作成します。


@設定クラス


WebApplicationInitializer




DispatcherServletを作成します

__with

以前に作成されたコンテキスト


7.2. Spring Bootはどのようにブートストラップしますか?

  • Spring Bootアプリケーションのエントリポイントは、

    @ SpringBootApplication

    :というアノテーションが付けられたクラスです。**

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

デフォルトでは、Spring Bootはアプリケーションの実行に埋め込みコンテナを使用します。この場合、Spring Bootは

public static void main

エントリポイントを使って組み込みWebサーバを起動します。

また、

Servlet、Filter、

、および

ServletContextInitializer

Beanのアプリケーションコンテキストから埋め込みサーブレットコンテナへのバインドも行います。

Spring Bootのもう1つの機能は、同じパッケージ内のすべてのクラスまたはMain-classのサブパッケージ内のコンポーネントを自動的にスキャンすることです。

Spring BootはそれをWebアーカイブとして外部コンテナに展開するオプションも提供します。この場合、

SpringBootServletInitializer

を拡張する必要があります。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
   //...
}

ここでは、外部サーブレットコンテナがWebアーカイブのMETA-INFファイルで定義されているメインクラスを探し、

SpringBootServletInitializer



Servlet、Filter、

、および

ServletContextInitializer.

をバインドします。


8パッケージングと配置

最後に、アプリケーションをパッケージ化してデプロイする方法を見てみましょう。どちらのフレームワークもMavenやGradleのような共通のパッケージ管理技術をサポートしています。しかし、展開に関しては、これらのフレームワークは大きく異なります。

たとえば、https://docs.spring.io/spring-boot/docs/current/maven-plugin/[Spring Boot Maven Plugin]は、MavenでSpring Bootをサポートしています。また、実行可能なjarまたはwarアーカイブをパッケージ化して「インプレース」でアプリケーションを実行することもできます。

展開のコンテキストでは、Springに比べてSpring Bootの利点は次のとおりです。

  • 埋め込みコンテナをサポート


  • java -jar

    コマンドを使用してjarを独立して実行するための準備

  • 潜在的なjar競合を回避するために依存関係を除外するオプション

外部コンテナにデプロイする
** デプロイ時にアクティブプロファイルを指定するためのオプション

  • 統合テスト用のランダムポート生成


9結論

このチュートリアルでは、SpringとSpring Bootの違いについて学びました。

一言で言えば、Spring Bootは単に開発、テスト、および展開をより便利にするためのSpring自体の拡張であると言えます。