1. 概要

このチュートリアルでは、標準のSpringフレームワークとSpring Bootの違いを見ていきます。

ここでは、MVCやセキュリティなどのSpringのモジュールが、コアSpringで使用した場合とブートで使用した場合の違いに焦点を当てて説明します。

2. 春とは?

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

依存性注入のようないくつかの優れた機能と、次のようなすぐに使えるモジュールが満載です。

  • Spring JDBC
  • SpringMVC
  • 春のセキュリティ
  • 春のAOP
  • 春のORM
  • 春のテスト

これらのモジュールは、アプリケーションの開発時間を大幅に短縮できます。

たとえば、Java Web開発の初期には、データソースにレコードを挿入するために多くの定型コードを記述する必要がありました。 SpringJDBCモジュールのJDBCTemplateを使用することで、わずかな構成で数行のコードに減らすことができます。

3. スプリングブーツとは?

Spring Bootは基本的にSpringフレームワークの拡張であり、Springアプリケーションのセットアップに必要なボイラープレート構成を排除します。

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

SpringBootの機能のほんの一部を次に示します。

  • ビルドとアプリケーションの構成を簡素化するための意見のある「スターター」依存関係
  • アプリケーション展開の複雑さを回避するための組み込みサーバー
  • メトリック、ヘルスチェック、および外部化された構成
  • Spring機能の自動構成–可能な場合はいつでも

これらのフレームワークの両方を段階的に理解していきましょう。

4. Mavenの依存関係

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

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

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

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

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

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

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

Spring Bootは、さまざまなSpringモジュールにいくつかのスターター依存関係を提供します。最も一般的に使用されるもののいくつかは次のとおりです。

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-test
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf

スターターの完全なリストについては、Springのドキュメントも確認してください。

5. MVC構成

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

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("/");
    }
}

また、@EnableWebMvcアノテーションを@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構成は、auto-configurationと呼ばれるプロセスを介してBootWebスターターを追加することで自動的に含まれます。

これが意味するのは、Spring Bootがアプリケーションに存在する依存関係、プロパティ、およびBeanを調べ、これらに基づいて構成を有効にすることです。

もちろん、独自のカスタム構成を追加する場合は、SpringBootの自動構成は元に戻ります。

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);
    }
}

Spring Boot 1では、Webアプリケーションで Thymeleaf のサポートを有効にするために、spring-boot-starter-thymeleafの依存関係のみが必要です。 Thymeleaf3.0の新機能により、 Spring Boot2Webアプリケーションの依存関係としてthymeleaf-layout-dialectも追加する必要があります。 または、 spring -boot-starter-thymeleaf 依存関係を追加して、これらすべてを処理することもできます。

依存関係が設定されたら、テンプレートを src / main / resources / templates フォルダーに追加すると、SpringBootによって自動的に表示されます。

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の依存関係を定義するだけで済みます。これにより、関連するすべての依存関係がクラスパスに自動的に追加されます。

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

SpringとSpringBootの両方でJPA構成を実現する方法については、記事 A Guide to JPA withSpringを参照してください。

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

SpringとSpringBootでのアプリケーションのブートストラップの基本的な違いは、サーブレットにあります。 Springは、ブートストラップエントリポイントとしてweb.xmlまたはSpringServletContainerInitializerのいずれかを使用します。

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

7.1. どのように春のブートストラップ?

Springは、従来の web.xml ブートストラップ法と、最新のサーブレット3+メソッドの両方をサポートしています。

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

  1. サーブレットコンテナ(サーバー)はweb.xml。を読み取ります
  2. web.xmlで定義されているDispatcherServletは、コンテナーによってインスタンス化されます。
  3. DispatcherServlet は、 WEB-INF / {servletName}-servlet.xml。を読み取ることにより、WebApplicationContextを作成します。
  4. 最後に、 DispatcherServlet は、アプリケーションコンテキストで定義されたBeanを登録します。

Springがサーブレット3以降のアプローチを使用してブートストラップする方法は次のとおりです。

  1. コンテナは、 ServletContainerInitializer を実装するクラスを検索し、実行します。
  2. SpringServletContainerInitializer は、WebApplicationInitializerを実装しているすべてのクラスを検索します。
  3. WebApplicationInitializer は、XMLまたは@Configurationクラスを使用してコンテキストを作成します。
  4. WebApplicationInitializer は、以前に作成されたコンテキストでDispatcherServletを作成します。

7.2. どのようにSpringBootBootstraps?

Spring Bootアプリケーションのエントリポイントは、@SpringBootApplicationで注釈が付けられたクラスです。

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

デフォルトでは、SpringBootは組み込みコンテナーを使用してアプリケーションを実行します。 この場合、SpringBootはpublic static voidmainエントリポイントを使用して組み込みWebサーバーを起動します。

また、 Servlet、Filter、、およびServletContextInitializerBeanのアプリケーションコンテキストから組み込みサーブレットコンテナへのバインドも処理します。

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

さらに、Spring Bootには、外部コンテナーにWebアーカイブとしてデプロイするオプションがあります。 この場合、SpringBootServletInitializerを拡張する必要があります。

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

ここで、外部サーブレットコンテナはWebアーカイブのMETA-INFファイルで定義されたメインクラスを検索し、 SpringBootServletInitializerサーブレット、フィルタ、および[ X216X]ServletContextInitializer。

8. パッケージ化と展開

最後に、アプリケーションをパッケージ化してデプロイする方法を見てみましょう。 これらのフレームワークは両方とも、MavenやGradleなどの一般的なパッケージ管理テクノロジーをサポートしています。 ただし、展開に関しては、これらのフレームワークは大きく異なります。

たとえば、 Spring Boot Mavenプラグインは、MavenでのSpringBootサポートを提供します。 また、実行可能jarまたはwarアーカイブをパッケージ化し、アプリケーションを「インプレース」で実行することもできます。

展開のコンテキストでのSpringに対するSpringBootの利点のいくつかは次のとおりです。

  • 埋め込みコンテナのサポートを提供します
  • コマンドjava-jar を使用して、jarを個別に実行するようにプロビジョニングします。
  • 外部コンテナーにデプロイするときに潜在的なjarの競合を回避するために、依存関係を除外するオプション
  • 展開時にアクティブなプロファイルを指定するオプション
  • 統合テスト用のランダムポート生成

9. 結論

この記事では、SpringとSpringBootの違いについて学びました。

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