スプリングフレームワークのよくある質問
目次
1. 前書き
この記事では、就職の面接中に出てくる可能性のある最も一般的な春関連の質問のいくつかを見ていきます。
2. スプリングコア
Q1. Spring Frameworkとは何ですか?
Springは、Java Enterprise Editionアプリケーションの開発に最も広く使用されているフレームワークです。 Springのコア機能は、あらゆるJavaアプリケーションの開発に使用できます。
Java EEプラットフォーム上でさまざまなWebアプリケーションを構築するためにその拡張機能を使用できます。または、単純なスタンドアロンアプリケーションで依存性注入の規定を使用することもできます。
Q2. Springを使用する利点は何ですか?
Springは、Java EE開発を容易にすることを目的としています。 これを使用する利点は次のとおりです。
-
Lightweight:開発でフレームワークを使用することにはわずかなオーバーヘッドがあります
-
Inversion of Control (IoC): Springコンテナは、依存オブジェクトを作成または検索する代わりに、さまざまなオブジェクトの配線依存関係を処理します
-
Aspect Oriented Programming (AOP): Springは、ビジネスロジックをシステムサービスから分離するためのAOPをサポートしています
-
IoC container: SpringBeanのライフサイクルとプロジェクト固有の構成を管理します
-
XML / JSON応答を返すことができるWebアプリケーションまたはRESTfulWebサービスの作成に使用されるMVC framework:
-
Transaction management:は、JavaアノテーションまたはSpring Bean XML構成ファイルのいずれかを使用して、JDBC操作やファイルのアップロードなどの定型コードの量を削減します。
-
Exception Handling: Springは、テクノロジー固有の例外をチェックされていない例外に変換するための便利なAPIを提供します
Q3. Springサブプロジェクトは何ですか? それらを簡単に説明してください。
-
Core –IoCやDIなどのフレームワークの基本的な部分を提供する主要なモジュール
-
JDBC –このモジュールは、特定のベンダーデータベースに対してJDBCコーディングを行う必要をなくすJDBC抽象化レイヤーを有効にします。
-
ORM integration – JPA、JDO、Hibernateなどの一般的なオブジェクトリレーショナルマッピングAPIの統合レイヤーを提供します
-
Web – Web指向の統合モジュール。マルチパートファイルのアップロード、サーブレットリスナー、およびWeb指向のアプリケーションコンテキスト機能を提供します。
-
MVC framework – Model ViewControllerデザインパターンを実装するWebモジュール
-
AOP module –クリーンなメソッドインターセプターとポイントカットの定義を可能にするアスペクト指向プログラミングの実装
Q4. 依存性注入とは何ですか?
Inversion of Control(IoC)の一面である依存性注入は、オブジェクトを手動で作成するのではなく、オブジェクトの作成方法を記述することを示す一般的な概念です。 IoCコンテナは、必要に応じて必要なクラスをインスタンス化します。
詳細については、hereを参照してください。
Q5. どうすれば春に豆を注入できますか?
いくつかの異なるオプションがあります。
-
セッター注入
-
コンストラクタインジェクション
-
フィールドインジェクション
構成は、XMLファイルまたは注釈を使用して実行できます。
詳細については、this articleを確認してください。
Q6. 豆を注入する最良の方法とその理由はどれですか?
推奨されるアプローチは、必須の依存関係にはコンストラクター引数を使用し、オプションの依存関係にはセッターを使用することです。 コンストラクター注入により、値を不変フィールドに注入でき、テストが容易になります。
Q7. BeanfactoryとApplicationcontextの違いは何ですか?
BeanFactoryは、Beanインスタンスを提供および管理するコンテナーを表すインターフェースです。 デフォルトの実装では、getBean()が呼び出されるとBeanが遅延インスタンス化されます。
ApplicationContextは、アプリケーション内のすべての情報、メタデータ、およびBeanを保持するコンテナーを表すインターフェースです。 また、BeanFactoryインターフェースを拡張しますが、デフォルトの実装では、アプリケーションの起動時にBeanを熱心にインスタンス化します。 この動作は、個々のBeanに対してオーバーライドできます。
すべての違いについては、the referenceを参照してください。
Q8. 春の豆とは何ですか?
Spring Beanは、Spring IoCコンテナーによって初期化されるJavaオブジェクトです。
Q9. Spring FrameworkのデフォルトのBeanスコープは何ですか?
デフォルトでは、Spring Beanはsingletonとして初期化されます。
Q10. Beanのスコープを定義する方法は?
Spring Beanのスコープを設定するには、XML構成ファイルで@Scopeアノテーションまたは「scope」属性を使用できます。 サポートされているスコープは5つあります。
-
シングルトン
-
プロトタイプ
-
要求
-
セッション
-
グローバルセッション
違いについては、hereを参照してください。
Q11. シングルトンBeanはスレッドセーフですか?
いいえ、シングルトンBeanはスレッドセーフではありません。スレッドセーフは実行に関するものであるのに対して、シングルトンは作成に焦点を合わせた設計パターンです。 スレッドの安全性は、Beanの実装自体にのみ依存します。
Q12. Spring Beanのライフサイクルはどのように見えますか?
最初に、JavaまたはXML Bean定義に基づいて、Spring Beanをインスタンス化する必要があります。 また、初期化を実行して使用可能な状態にする必要があります。 その後、Beanが不要になると、IoCコンテナから削除されます。
すべての初期化メソッドを含むサイクル全体が画像(source)に示されています。
Q13. Spring Javaベースの構成とは何ですか?
これは、Springベースのアプリケーションをタイプセーフな方法で構成する方法の1つです。 これは、XMLベースの構成に代わるものです。
また、プロジェクトをXMLからJava構成に移行する場合は、to this articleを参照してください。
Q14. 1つのプロジェクトに複数のSpring構成ファイルを含めることはできますか?
はい。大規模なプロジェクトでは、保守性とモジュール性を高めるために複数のSpring構成を使用することをお勧めします。
複数のJavaベースの構成ファイルをロードできます。
@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {
または、他のすべての構成を含む1つのXMLファイルをロードします。
ApplicationContext context = new ClassPathXmlApplicationContext("spring-all.xml");
そして、このXMLファイル内には次のものがあります。
Q15. Spring Securityとは何ですか?
Spring SecurityはSpringフレームワークの独立したモジュールであり、Javaアプリケーションで認証および認可メソッドを提供することに焦点を当てています。 また、CSRF攻撃などの一般的なセキュリティ脆弱性のほとんどを処理します。
WebアプリケーションでSpringSecurityを使用するには、@EnableWebSecurityという簡単な注釈から始めることができます。
security on exampleに関連する一連の記事全体を見つけることができます。
Q16. Spring Bootとは何ですか?
Spring Bootは、事前に構成されたフレームワークのセットを提供して、ボイラープレート構成を削減し、最小限のコードでSpringアプリケーションを実行できるようにするプロジェクトです。
Q17. Spring Frameworkで使用されているデザインパターンのいくつかに名前を付けますか?
-
Singleton Pattern:シングルトンスコープのBean
-
Factory Pattern: BeanFactoryクラス
-
Prototype Pattern:プロトタイピングされたBean
-
Adapter Pattern: SpringWebおよびSpringMVC
-
Proxy Pattern:Springアスペクト指向プログラミングのサポート
-
Template Method Pattern:JdbcTemplate、HibernateTemplate,など。
-
Front Controller: Spring MVCDispatcherServlet
-
Data Access Object: SpringDAOサポート
-
Model View Controller: Spring MVC
Q18. スコーププロトタイプはどのように機能しますか?
スコープprototypeは、Beanのインスタンスを呼び出すたびに、Springが新しいインスタンスを作成して返すことを意味します。 これは、Spring IoCコンテナごとに1つのオブジェクトインスタンスがインスタンス化されるデフォルトのsingletonスコープとは異なります。
3. Spring Web MVC
Q19. Spring BeanでServletContextおよびServletConfigオブジェクトを取得する方法は?
次のいずれかの方法で実行できます。
-
Spring対応インターフェイスの実装。 完全なリストはhereで入手できます。
-
これらのBeanで@Autowiredアノテーションを使用する:
@Autowired
ServletContext servletContext;
@Autowired
ServletConfig servletConfig;
Q20. Spring Mvcのコントローラーとは何ですか?
簡単に言えば、DispatcherServletによって処理されるすべての要求は、@Controllerで注釈が付けられたクラスに送信されます。 各コントローラークラスは、1つ以上の要求を、提供された入力で要求を処理および実行するメソッドにマップします。
一歩後退する必要がある場合は、Front Controller in the typical Spring MVC architectureの概念を確認することをお勧めします。
Q21. @Requestmappingアノテーションはどのように機能しますか?
@RequestMappingアノテーションは、WebリクエストをSpringControllerメソッドにマップするために使用されます。 単純なユースケースに加えて、HTTPヘッダーのマッピング、URIの一部を@PathVariable,でバインドし、URIパラメーターと@RequestParamアノテーションを操作するために使用できます。
@RequestMappingの詳細については、hereを参照してください。
For more Spring MVC questions, please check out Spring MVC Interview Questions article。
4. Spring Data Access
Q22. Spring Jdbctemplateクラスとは何ですか?その使用方法は?
Spring JDBCテンプレートは、関心のあるデータベース操作ロジックにアクセスするための主要なAPIです。
-
接続の作成と終了
-
ステートメントとストアドプロシージャコールの実行
-
ResultSetを繰り返し、結果を返す
これを使用するには、DataSourceの単純な構成を定義する必要があります。
@Configuration
@ComponentScan("org.example.jdbc")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("guest_user");
dataSource.setPassword("guest_password");
return dataSource;
}
}
詳細については、this quick articleを参照してください。
Q23. 春にトランザクションをどのように有効にし、その利点は何ですか?
Transactionsを構成するには、注釈を使用する方法とアスペクト指向プログラミング(AOP)を使用する方法の2つの異なる方法があり、それぞれに利点があります。
official docsによると、SpringTransactionsを使用する利点は次のとおりです。
-
JTA、JDBC、Hibernate、JPA、JDOなどのさまざまなトランザクションAPIで一貫したプログラミングモデルを提供する
-
宣言的なトランザクション管理をサポート
-
JTAなどのいくつかの複雑なトランザクションAPIよりも、プログラムによるトランザクション管理のためのシンプルなAPIを提供する
-
Springのさまざまなデータアクセスの抽象化と非常にうまく統合する
Q24. Spring Daoとは何ですか?
Spring Data Access Objectは、JDBC、Hibernate、JPAなどのデータアクセステクノロジーと一貫性のある簡単な方法で連携するために提供されるSpringのサポートです。
もちろん、entire seriesでSpringの永続性について説明することで、永続性についてさらに詳しく知ることができます。
5. 春のアスペクト指向プログラミング(AOP)
Q25. アスペクト指向プログラミングとは何ですか?
Aspectsは、影響を受けるクラスを変更せずに既存のコードに追加の動作を追加することにより、複数のタイプやオブジェクトにまたがるトランザクション管理などの横断的関心事のモジュール化を可能にします。
Q26. Aopのアスペクト、アドバイス、ポイントカット、ジョインポイントとは何ですか?
-
Aspect:トランザクション管理などの横断的関心事を実装するクラス
-
Advice:アプリケーションでPointcutと一致する特定のJoinPointに到達したときに実行されるメソッド
-
Pointcut:Adviceを実行する必要があるかどうかを判断するために、JoinPointと照合される正規表現のセット
-
JoinPoint:メソッドの実行や例外の処理など、プログラムの実行中のポイント
Q27. 織りとは何ですか?
official docsによると、weavingは、アスペクトを他のアプリケーションタイプまたはオブジェクトとリンクして、アドバイスされたオブジェクトを作成するプロセスです。 これは、コンパイル時、ロード時、または実行時に実行できます。 Spring AOPは、他の純粋なJava AOPフレームワークと同様に、実行時にweavingを実行します。
6. 春5
Q28. リアクティブプログラミングとは何ですか?
リアクティブプログラミングは、少数のスレッドでスケーリングする非ブロッキングのイベント駆動型アプリケーションに関するものであり、バックプレッシャは、プロデューサーがコンシューマーを圧倒しないようにすることを目的とした重要な要素です。
リアクティブプログラミングの主な利点は次のとおりです。
-
マルチコアおよびマルチCPUハードウェア上のコンピューティングリソースの使用率の向上
-
シリアル化を減らしてパフォーマンスを向上
通常、リアクティブプログラミングはイベント駆動型であり、リアクティブシステムはメッセージ駆動型です。 したがって、リアクティブプログラミングを使用しても、アーキテクチャスタイルであるリアクティブシステムを構築しているわけではありません。
ただし、Reactive Manifestoに従えば、リアクティブプログラミングをリアクティブシステムを実装する手段として使用できます。これは、理解することが非常に重要です。
これに基づいて、リアクティブシステムには4つの重要な特性があります。
-
Responsive:システムはタイムリーに応答する必要があります
-
Resilient:システムに障害が発生した場合でも、応答性を維持する必要があります
-
Elastic:リアクティブシステムは変更に反応し、さまざまなワークロードの下で応答性を維持できます
-
Message-driven:リアクティブシステムは、非同期メッセージパッシングに依存してコンポーネント間の境界を確立する必要があります
Q29. Spring Webfluxとは何ですか?
Spring WebFluxはSpringのリアクティブスタックWebフレームワークであり、SpringMVCの代替手段です。
このリアクティブモデルを実現し、高度にスケーラブルにするために、スタック全体が非ブロッキングです。 詳細については、tutorial on Spring 5 WebFluxを確認してください。
Q30. モノラルタイプとフラックスタイプは何ですか?
Spring Framework 5のWebFluxフレームワークは、非同期基盤としてReactorを使用します。
このプロジェクトは、2つのコアタイプを提供します。単一の非同期値を表すMonoと、非同期値のストリームを表すFluxです。 どちらも、Reactive Streams仕様で定義されているPublisherインターフェースを実装しています。
MonoはPublisherを実装し、0または1個の要素を返します。
public abstract class Mono implements Publisher {...}
また、, FluxはPublisherを実装し、N要素を返します。
public abstract class Flux implements Publisher {...}
定義上、2つのタイプはストリームを表すため、どちらもレイジーです。つまり、subscribe()メソッドを使用してストリームを消費するまで、何も実行されません。 どちらのタイプも不変であるため、任意のメソッドを呼び出すと、Flux or Monoの新しいインスタンスが返されます。
Q31. WebclientとWebtestclientの用途は何ですか?
WebClientは、新しいWeb Reactiveフレームワークのコンポーネントであり、非ブロッキングHTTPリクエストを実行するためのリアクティブクライアントとして機能できます。 リアクティブクライアントであるため、バックプレッシャでリアクティブストリームを処理でき、Java 8ラムダを最大限に活用できます。 また、同期シナリオと非同期シナリオの両方を処理できます。
一方、WebTestClientは、テストで使用できる同様のクラスです。 基本的に、これはWebClient.の周りの薄いシェルです。HTTP接続を介して任意のサーバーに接続できます。 また、HTTPサーバーを必要とせずに、モック要求および応答オブジェクトを使用してWebFluxアプリケーションに直接バインドすることもできます。
Q32. リアクティブストリームを使用することのデメリットは何ですか?
リアクティブストリームを使用する主な欠点は次のとおりです。
-
リアクティブアプリケーションのトラブルシューティングは少し難しいです。いくつかの便利なデバッグのヒントについては、必ずtutorial on debugging reactive streamsを確認してください。
-
従来のリレーショナルデータストアはまだリアクティブパラダイムを採用していないため、リアクティブデータストアのサポートは限られています。
-
実装する際に追加の学習曲線があります
Q33. Spring 5は古いバージョンのJavaと互換性がありますか?
Java 8の機能を利用するために、Springコードベースが改良されました。 これは、古いバージョンのJavaは使用できないことを意味します。 したがって、フレームワークには少なくともJava 8が必要です。
Q34. Spring5はJdk9のモジュール性とどのように統合されますか?
Spring 5では、すべてがモジュール化されているため、探している機能を備えていない可能性のあるjarをインポートする必要はありません。
このテクノロジーがどのように機能するかについての詳細な理解については、guide to Java 9 modularityをご覧ください。
Java 9の新しいモジュール機能と、この概念に基づいてSpring5プロジェクトを編成する方法を理解するための例を見てみましょう。
まず、Stringの「HelloWorld」を返す単一のメソッドを含む新しいクラスを作成しましょう。 これを新しいJavaプロジェクト内に配置します–HelloWorldModule:
package com.hello;
public class HelloWorld {
public String sayHello(){
return "HelloWorld";
}
}
次に、新しいモジュールを作成しましょう。
module com.hello {
export com.hello;
}
次に、モジュールを定義して上記のモジュールを使用する新しいJavaプロジェクトHelloWorldClientを作成しましょう。
module com.hello.client {
requires com.hello;
}
上記のモジュールは現在テストに利用できます:
public class HelloWorldClient {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
log.info(helloWorld.sayHello());
}
}
Q35. 同じアプリケーションでWebMvcとWebfluxの両方を使用できますか?
現在、Spring Bootは、クラスパスに存在する依存関係に応じてコンテキストを自動構成しようとするため、Spring MVCまたはSpring WebFluxのいずれかのみを許可します。
また、Spring MVCはNettyでは実行できません。 さらに、MVCはブロッキングパラダイムであり、WebFluxは非ブロッキングスタイルであるため、目的が異なるため、両方を混在させるべきではありません。
7. 結論
この広範な記事では、Springに関するすべての技術面接で最も重要な質問のいくつかを調査しました。
この記事が今後の春のインタビューに役立つことを願っています。 がんばろう!