I have posted a lot of Spring Tutorials recently. This post will help you get through Spring interview Questions explaining the core concepts in detail.
Spring Frameworkは、Webアプリケーションのための最も人気のあるJava EEフレームワークの一つです。 依存性の注入と面向けプログラミングは、Springフレームワークの中心です。Spring Frameworkに精通していれば、Javaのインタビューで選ばれる可能性が非常に高くなります。
プロのヒント: Core Javaは、どんなJavaベースのフレームワークでも基礎となるので、インタビューの準備をしている場合は、Core Javaのインタビューの質問とJavaのインタビューの質問の記事を読んでください。
Springのインタビューの質問と回答
ここでは、約50のSpringのインタビューの質問と回答を提供します。Spring 5までの最新機能、例えばリアクティブプログラミングのためのSpring WebFluxもカバーしています。
1. Spring Frameworkとは何ですか?
Springは、最も広く使用されているJava EEフレームワークの1つです。
Springフレームワークの中核となる概念は「依存性注入(Dependency Injection)」と「アスペクト指向プログラミング(Aspect-Oriented Programming)」です。
I like spring because it provides a lot of features and different modules for specific tasks such as Spring MVC and Spring JDBC. Since it’s an open-source framework with a lot of online resources and active community members, working with the Spring framework is easy and fun at the same time.
おすすめの読み物: Spring Framework
2. Spring Frameworkの重要な機能は何ですか?
Spring Frameworkは、依存性注入とアスペクト指向プログラミングという2つの設計コンセプトの上に構築されています。
Springフレームワークの特徴の一部は次のとおりです:
- 軽量で、フレームワークを使用することで開発にほとんどオーバーヘッドがありません。
- 依存性注入または制御の反転を使用して、互いに独立したコンポーネントを記述し、Springコンテナがそれらを結びつけることで作業を達成します。
- Spring IoCコンテナは、Spring BeanのライフサイクルとJNDIの構成など、プロジェクト固有の構成を管理します。
- Spring MVCフレームワークは、WebアプリケーションおよびRESTfulウェブサービスを作成するために使用でき、XMLおよびJSONのレスポンスを返すことができます。
- トランザクション管理、JDBC操作、ファイルのアップロード、例外処理などを、アノテーションまたはSpring Beanの設定ファイルを使用して非常に少ない構成でサポートします。
3. Spring Frameworkを使用する利点は何ですか?
Spring Frameworkを使用する利点の一部は次のとおりです:
- アプリケーションのさまざまなコンポーネント間の直接的な依存関係を減らすことができます。Spring IoCコンテナは、リソースやBeanを初期化し、依存関係として注入します。
- Springフレームワークでは、ビジネスロジックが実際のリソースの実装クラスとの直接的な依存関係を持たないため、ユニットテストケースの作成が容易です。テスト構成を簡単に作成し、テスト目的でモックBeanを注入することができます。
- オブジェクトの初期化、リソースのオープン/クローズなどのようなボイラープレートコードの量を減らすことができます。JdbcTemplateクラスが気に入っていますが、これにより、JDBCプログラミングに付随するすべてのボイラープレートコードを削除できます。
- Springフレームワークは、いくつかのモジュールに分割されており、アプリケーションを軽量に保つのに役立ちます。たとえば、Springトランザクション管理機能が不要な場合、プロジェクトにその依存関係を追加する必要はありません。
- Springフレームワークは、Java EEのほとんどの機能をサポートしており、さらに多くの機能も提供しています。常に新しい技術の最先端にあります。たとえば、Android向けのSpringプロジェクトがあり、ネイティブAndroidアプリケーションのためのより良いコードを書くのに役立ちます。これにより、Springフレームワークは完全なパッケージとなり、さまざまな要件に対して異なるフレームワークを探す必要はありません。
4. Spring 5の重要な機能は何ですか?
Spring 5は、Spring 4からの大幅な改訂です。いくつかの重要な機能は次のとおりです:
- Java 8およびそれ以降のバージョンのサポートにより、ラムダ式を使用することができます。
- Java EE7およびServlet 4.0の仕様のサポート。
- ファイル操作は、NIO 2ストリームを介して行われるようになりました。アプリケーションで多くのファイル処理を行う場合、大幅な改善です。
- ログ出力を整理するためにspring-jclが導入されました。以前はログ出力のための単一のポイントがなかったため、混乱していました。
- Kotlin、Lombok、Reactor 3.1 Flux、およびMono、およびRxJavaのサポート。
- Spring WebFluxにより、リアクティブプログラミングがSpringにもたらされます。
- JUnit 5のサポート
- クラスパススキャンではなく、インデックスファイル「META-INF/spring.components」を介してSpringコンポーネントの情報を提供するためのサポート。
詳細については、Spring 5の機能を参照してください。
5. Spring WebFluxとは何ですか?
Spring WebFluxは、Spring 5で導入された新しいモジュールです。Spring WebFluxは、Springフレームワークにおける反応型プログラミングモデルへの第一歩です。
Spring WebFluxは、Spring MVCモジュールの代替です。Spring WebFluxを使用すると、イベントループ実行モデルに基づいて完全に非同期かつ非ブロッキングなアプリケーションを作成できます。
詳細については、Spring WebFluxチュートリアルをご覧ください。
6. 依存性注入とは何ですか?
依存性注入デザインパターンを使用すると、ハードコードされた依存関係を削除し、アプリケーションを疎結合かつ拡張可能かつ保守可能にすることができます。依存性注入パターンを実装することで、依存性の解決をコンパイル時から実行時に移動させることができます。
依存性の注入を使用する利点のいくつかは、関心の分離、ボイラープレートコードの削減、設定可能なコンポーネント、および簡単な単体テストです。
詳細は、依存性の注入チュートリアルを参照してください。また、依存性の注入プロセスを自動化するためにGoogle Guiceを使用することもできます。ただし、ほとんどの場合、依存性の注入以上のものを求めており、それがSpringの存在意義です。
7. SpringフレームワークでDIを実装するにはどうすればよいですか?
SpringアプリケーションでDIを実装するには、Spring XMLベースの設定とアノテーションベースの設定の両方を使用することができます。より理解を深めるためには、JUnitテストケースを使用して両方の方法を学ぶことができるSpring依存性の注入の例を参照してください。この記事には、さらに学習するためにダウンロードして試すことができるサンプルプロジェクトのzipファイルも含まれています。
8. Spring Tool Suiteの利点は何ですか?
Spring Tool Suiteの利用による利点は以下の通りです。Eclipseにプラグインをインストールすることで、Spring Tool Suiteの機能をすべて利用することができます。ただし、STSにはMavenサポート、さまざまな種類のSpringプロジェクトを作成するためのテンプレート、Springアプリケーションのパフォーマンスを向上させるためのtc serverなど、他の重要な機能も含まれています。
I like STS because it highlights the Spring components and if you are using AOP pointcuts and advice, then it clearly shows which methods will come under the specific pointcut. So rather than installing everything on our own, I prefer using STS when developing Spring-based applications.
9. 重要なSpringモジュールの名前をいくつか挙げてください。
重要なSpring Frameworkのモジュールの一部を以下に示します。
- Spring Context – 依存性の注入のためのモジュール。
- Spring AOP – アスペクト指向プログラミングのためのモジュール。
- Spring DAO – DAOパターンを使用したデータベース操作のためのモジュール。
- Spring JDBC – JDBCおよびDataSourceのサポートのためのモジュール。
- Spring ORM – HibernateなどのORMツールのサポートのためのモジュール。
- Spring Web Module – Webアプリケーションの作成のためのモジュール。
- Spring MVC – Webアプリケーション、WebサービスなどのためのModel-View-Controllerの実装。
10. アスペクト指向プログラミングとは何ですか?
エンタープライズアプリケーションには、ログ記録、トランザクション管理、データの検証、認証など、さまざまな種類のオブジェクトやアプリケーションモジュールに適用される共通のクロスカッティングの関心事があります。オブジェクト指向プログラミングでは、クラスによってアプリケーションのモジュラリティが実現されます。AOPでは、アプリケーションのモジュラリティはアスペクトによって実現され、異なるクラスのメソッドを横断してカットします。
AOPは、通常のオブジェクト指向プログラミングではクラスに直接依存することができないクロスカッティングのタスクの依存性を取り除きます。たとえば、ログのために別のクラスを作成することはできますが、他のクラスはこれらのメソッドを呼び出さなければなりません。しかし、AOPでは、アスペクトを構成し、メソッドの実行が自動的に行われます。Spring AOPのサポートについては、Spring AOPの例を参照してください。
11. AOPにおけるアスペクト、アドバイス、ポイントカット、ジョイントポイント、アドバイス引数とは何ですか?
アスペクト:アスペクトは、トランザクション管理などのクロスカッティングな関心事を実装するクラスです。アスペクトは通常のクラスとして設定し、Spring Beanの設定ファイルで設定するか、@Aspect
アノテーションを使用してクラスをアスペクトとして宣言するためにSpring AspectJサポートを使用することができます。
アドバイス:アドバイスは、特定のジョインポイントに対して実行されるアクションです。プログラミングの観点からは、アプリケーションで一致するポイントカットのジョインポイントに到達したときに実行されるメソッドです。アドバイスは、Springのインターセプターやサーブレットフィルターのようなものと考えることができます。
ポイントカット:ポイントカットは、アドバイスが実行される必要があるかどうかを判断するためにジョインポイントと一致する正規表現です。ポイントカットは、ジョインポイントと一致するさまざまな種類の式を使用します。Springフレームワークでは、アドバイスメソッドが適用されるジョインポイントを決定するために、AspectJのポイントカット式言語を使用します。
ジョインポイント:ジョインポイントは、メソッドの実行、例外処理、オブジェクト変数の値の変更など、アプリケーション内の特定のポイントです。Spring AOPでは、ジョインポイントは常にメソッドの実行です。
アドバイス引数:アドバイスメソッドに引数を渡すことができます。引数パターンに一致するメソッドに適用されるポイントカットで、args()式を使用することができます。これを使用する場合、引数の型が決定されるアドバイスメソッドで同じ名前を使用する必要があります。
これらの概念は最初は混乱するかもしれませんが、Spring Aspect, Advice Exampleを読むと簡単に関連付けることができます。
12. Spring AOPとAspectJ AOPの違いは何ですか?
AspectJはアスペクト指向プログラミングの業界標準の実装ですが、Springは一部のケースでAOPを実装しています。Spring AOPとAspectJの主な違いは次のとおりです:
- Spring AOPはウィービングプロセスについて心配する必要がないため、AspectJよりも使用が簡単です。
- Spring AOPはAspectJのアノテーションをサポートしているため、AspectJに慣れている場合、Spring AOPの使用が容易です。
- Spring AOPはプロキシベースのAOPのみをサポートしているため、メソッド実行ジョインポイントにのみ適用することができます。AspectJはあらゆる種類のポイントカットをサポートしています。
- Spring AOPの欠点の一つは、Springコンテキストを介して作成されたビーンにのみ適用できることです。
13. Spring IoCコンテナとは何ですか?
制御の反転(IoC)は、オブジェクトの依存関係間の疎結合を実現する仕組みです。疎結合とランタイムでのオブジェクトの動的バインディングを実現するため、オブジェクトは他のアセンブラオブジェクトによって注入される依存関係を定義します。Spring IoCコンテナは、依存関係をオブジェクトに注入し、使用準備ができた状態にします。
SpringフレームワークのIoCコンテナクラスは、org.springframework.beans
とorg.springframework.context
パッケージに属しており、オブジェクトの依存関係を切り離すためのさまざまな方法を提供しています。
私たちが使用するいくつかの有用なApplicationContextの実装は次のとおりです。
- AnnotationConfigApplicationContext:アノテーションベースの構成を使用するスタンドアロンのJavaアプリケーション向け。
- ClassPathXmlApplicationContext:XMLベースの構成を使用するスタンドアロンのJavaアプリケーション向け。
- FileSystemXmlApplicationContext:ClassPathXmlApplicationContextと同様ですが、XML構成ファイルをファイルシステムの任意の場所からロードできます。
- Webアプリケーション向けのAnnotationConfigWebApplicationContextおよびXmlWebApplicationContext。
14. Spring Beanとは何ですか?
Spring IoCコンテナによって初期化される通常のJavaクラスをSpring Beanと呼びます。Spring ApplicationContext
を使用してSpring Beanのインスタンスを取得します。
Spring IoCコンテナは、Spring Beanのライフサイクル、Beanのスコープ、およびBeanへの必要な依存関係のインジェクションを管理します。
15. Spring Bean設定ファイルの重要性は何ですか?
Spring Bean設定ファイルを使用して、Springコンテキストによって初期化されるすべてのBeanを定義します。Spring ApplicationContextのインスタンスを作成する際、spring bean XMLファイルが読み込まれ、それらのBeanがすべて初期化されます。コンテキストが初期化されると、異なるBeanインスタンスを取得するために使用できます。
Spring Beanの設定に加えて、このファイルにはSpring MVCのインターセプター、ビューリゾルバー、およびアノテーションベースの構成をサポートする他の要素も含まれています。
16. クラスをSpring Beanとして構成する異なる方法はありますか?
Spring Beanを構成する方法は3つあります。
XML構成:これは最も一般的な構成方法であり、コンテキストファイルのbean要素を使用してSpring Beanを構成できます。例えば:
<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>
Javaベースの構成:アノテーションのみを使用している場合、@Bean
アノテーションを使用してSpring Beanを構成できます。このアノテーションは、@Configuration
クラスと共に使用され、Spring Beanを構成します。サンプル構成は以下の通りです:
@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {
@Bean
public MyService getService(){
return new MyService();
}
}
SpringコンテキストからこのBeanを取得するには、次のコードスニペットを使用する必要があります:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
アノテーションベースの構成:クラスに@Component、@Service、@Repository、および@Controllerアノテーションを使用して、それらをSpring Beanとして構成することもできます。これらについては、これらのクラスをスキャンするためのベースパッケージの場所を指定する必要があります。例えば:
<context:component-scan base-package="com.journaldev.spring" />
17. Spring Beanの異なるスコープは何ですか?
Spring Beanには5つのスコープが定義されています。
- singleton: コンテナごとにBeanのインスタンスは1つだけ作成されます。これはSpring Beanのデフォルトスコープです。このスコープを使用する際は、Spring Beanに共有インスタンス変数がないことを確認してください。そうでない場合、データの整合性の問題が発生する可能性があります。
- prototype: Beanが要求されるたびに新しいインスタンスが作成されます。
- request: これはprototypeスコープと同じですが、ウェブアプリケーションで使用するためのものです。HTTPリクエストごとにBeanの新しいインスタンスが作成されます。
- session: コンテナによってHTTPセッションごとに新しいBeanが作成されます。
- global-session: これはポートレットアプリケーション用のグローバルセッションBeanを作成するために使用されます。
Spring Frameworkは拡張可能であり、独自のスコープを作成することもできます。ただし、ほとんどの場合、フレームワークが提供するスコープで十分です。Spring Beanのスコープを設定するには、Bean要素の「scope」属性または@Scopeアノテーションを使用できます。
18. Spring Beanのライフサイクルは何ですか?
Spring BeanはSpringコンテナによって初期化され、すべての依存関係も注入されます。コンテキストが破棄されると、初期化されたすべてのBeanも破棄されます。これはほとんどの場合にうまく機能しますが、時にはBeanを使用可能にする前に他のリソースの初期化や検証を行いたい場合があります。Springフレームワークは、Spring Bean内のポスト初期化メソッドとプリデストロイメソッドのサポートを提供しています。
これは2つの方法で実行できます。 InitializingBean
とDisposableBean
インターフェースを実装するか、Spring Beanの設定でinit-methodとdestroy-method属性を使用することです。詳細については、Spring Beanのライフサイクルメソッドを参照してください。
19. Spring Bean内でServletContextとServletConfigオブジェクトを取得する方法は?
Spring Bean内でコンテナ固有のオブジェクトを取得する方法は2つあります。
- Spring *Awareインターフェースを実装するために、ServletContextAwareとServletConfigAwareインターフェースを使用します。これらのAwareインターフェースの完全な例については、Spring Awareインターフェースを読んでください。
@Autowired
注釈をServletContext
とServletConfig
の型のビーン変数に使用します。これらは、サーブレットコンテナ固有の環境でのみ動作します。
@Autowired
ServletContext servletContext;
20. Beanのワイヤリングと@Autowired注釈とは何ですか?
Spring Beanの依存関係を初期化しながら注入するプロセスをSpring Beanワイヤリングと呼びます。
通常、すべてのBeanの依存関係の明示的なワイヤリングがベストプラクティスですが、Springフレームワークは自動ワイヤリングもサポートしています。この注釈は、フィールドまたはメソッドにbyTypeでの自動ワイヤリングに使用することができます。この注釈を使用するには、Spring Beanの設定ファイルで注釈ベースの構成を有効にする必要があります。これは、context:annotation-config要素によって行うことができます。
@Autowired
注釈の詳細については、Spring Autowireの例を読んでください。
21. Spring Beanの異なるタイプの自動ワイヤリングは何ですか?
Springフレームワークには4つの自動ワイヤリングのタイプがあります。
- byNameでワイヤリング
- byTypeでワイヤリング
- コンストラクターでワイヤリング
- @Autowiredおよび@Qualifierアノテーションによるワイヤリング
Spring 3.1以前では、autowire by autodetectもサポートされており、これはコンストラクターまたはbyTypeでの自動ワイヤリングに似ています。これらのオプションの詳細については、Spring Bean Autowiringを参照してください。
22. Spring Beanはスレッドセーフを提供しますか?
Spring Beanのデフォルトのスコープはシングルトンであり、コンテキストごとに1つのインスタンスが存在します。つまり、どのスレッドでも更新できるクラスレベルの変数がある場合、データの整合性が保たれません。したがって、デフォルトモードではSpring Beanはスレッドセーフではありません。
ただし、パフォーマンスの犠牲を払ってスレッドセーフを実現するために、スプリングのビーンスコープをリクエスト、プロトタイプ、またはセッションに変更することも可能です。これはプロジェクトの要件に基づいたデザインの決定です。
23. Spring MVCにおけるControllerとは何ですか?
MVCデザインパターンと同様に、Controllerはすべてのクライアントのリクエストを処理し、それらを設定されたリソースに送信するクラスです。Spring MVCでは、DispatcherServletがフロントコントローラクラスであり、スプリングのビーンの設定に基づいてコンテキストを初期化します。
A Controller class is responsible to handle a different kind of client requests based on the request mappings. We can create a controller class by using @Controller annotation. Usually, it’s used with @RequestMapping annotation to define handler methods for specific URI mapping.
24. Springの@Component、@Controller、@Repository、@Serviceのアノテーションの違いは何ですか?
@Componentは、クラスがコンポーネントであることを示すために使用されます。これらのクラスは自動検出のために使用され、注釈ベースの設定でビーンとして構成されます。
@Controllerは、MVCアプリケーションで使用される特定のタイプのコンポーネントであり、主にRequestMapping注釈と一緒に使用されます。
@Repository注釈は、コンポーネントがリポジトリとして使用され、データの保存/取得/検索のメカニズムを示すために使用されます。この注釈は、DAOパターンの実装クラスに適用することができます。
@Serviceは、クラスがサービスであることを示すために使用されます。通常、いくつかのサービスを提供するビジネスファサードクラスにこの注釈が付けられます。
クラスの自動検出のために上記のいずれの注釈を使用することができますが、異なるタイプが提供されているため、注釈付きクラスの目的を簡単に区別することができます。
25. DispatcherServletとContextLoaderListenerとは何ですか?
DispatcherServletは、Spring MVCアプリケーションのフロントコントローラであり、Springのビーン構成ファイルをロードし、構成されたすべてのビーンを初期化します。アノテーションが有効になっている場合、パッケージをスキャンし、@Component、@Controller、@Repository、または@Serviceアノテーションで注釈付けされたビーンを構成します。
ContextLoaderListenerは、SpringのルートWebApplicationContextを起動およびシャットダウンするためのリスナーです。その重要な機能は、ApplicationContextのライフサイクルをServletContextのライフサイクルに結び付けることと、ApplicationContextの作成を自動化することです。これを使用して、異なるSpringコンテキスト間で使用できる共有ビーンを定義することができます。
26. SpringにおけるViewResolverとは何ですか?
ViewResolverの実装は、名前によってビューページを解決するために使用されます。これは、Springのビーン構成ファイルで構成します。例えば:
<!-- @Controllersによってレンダリングのために選択されたビューを/WEB-INF/viewsディレクトリ内の.jspリソースに解決する -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
InternalResourceViewResolverは、ViewResolverインターフェースの実装の1つであり、ビーンのプロパティを介してビューページのディレクトリと接尾辞の場所を提供します。したがって、コントローラーハンドラーメソッドが「home」を返す場合、ビューリゾルバは/WEB-INF/views/home.jspにあるビューページを使用します。
27. MultipartResolverとは何か、そしていつ使用されるのか?
MultipartResolverインターフェースは、ファイルのアップロードに使用されます。Springフレームワークでは、ファイルのアップロードのために提供される2つの実装であるCommonsMultipartResolverとStandardServletMultipartResolverがあります。デフォルトでは、マルチパートリゾルバは構成されていませんが、ファイルのアップロードに使用するためには、springのbean設定でタイプがMultipartResolverである「multipartResolver」という名前のビーンを定義するだけです。
設定が完了すると、任意のマルチパートリクエストは構成されたMultipartResolverによって解決され、ラップされたHttpServletRequestが渡されます。その後、コントローラークラスでファイルを取得して処理に使用されます。完全な例については、Spring MVCファイルのアップロードの例を参照してください。
28. Spring MVCフレームワークでの例外処理の方法
Spring MVCフレームワークでは、以下の方法を提供しており、堅牢な例外処理を実現することができます。
コントローラーベース – コントローラークラス内に例外処理メソッドを定義することができます。ただし、これらのメソッドには@ExceptionHandlerアノテーションを付ける必要があります。
グローバル例外ハンドラー – 例外処理は横断的な関心事であり、Springは@ControllerAdviceアノテーションを提供しており、任意のクラスでグローバル例外ハンドラーを定義することができます。
HandlerExceptionResolverの実装 – 一般的な例外に対しては、ほとんどの場合、静的なページを提供します。Spring FrameworkはHandlerExceptionResolverインターフェースを提供しており、これを実装することでグローバルな例外ハンドラーを作成することができます。グローバル例外ハンドラーを定義するこの追加的な方法の理由は、Springフレームワークがデフォルトの実装クラスも提供しているため、Springフレームワークの例外処理の恩恵を得ることができるからです。
完全な例については、Spring例外処理の例をお読みください。
29. JavaプログラムでApplicationContextを作成する方法は?
スタンドアロンJavaプログラムでSpringコンテキストを作成する方法は次のとおりです。
- AnnotationConfigApplicationContext:SpringをスタンドアロンのJavaアプリケーションで使用し、アノテーションを使用して構成している場合は、このクラスを使用してコンテナを初期化し、ビーンオブジェクトを取得できます。
- ClassPathXmlApplicationContext:スタンドアロンのアプリケーションでSpringのビーン構成XMLファイルがある場合は、このクラスを使用してファイルをロードし、コンテナオブジェクトを取得できます。
- FileSystemXmlApplicationContext:これはClassPathXmlApplicationContextと似ていますが、XML構成ファイルをファイルシステムの任意の場所からロードできます。
30. 複数のSpring構成ファイルを持つことはできますか?
Spring MVCアプリケーションでは、contextConfigLocationを介して複数のSpringコンテキスト設定ファイルを定義することができます。この場所の文字列には、コンマとスペースのいくつかで区切られた複数の場所が含まれることができます。例えば;
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
また、複数のルートレベルのSpring設定を定義し、context-paramを介してそれをロードすることもできます。例えば;
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>
別のオプションは、コンテキスト設定ファイルでimport要素を使用して他の設定をインポートすることです。例えば:
<beans:import resource="spring-jdbc.xml"/>
31. ContextLoaderListenerとは何ですか?
ContextLoaderListenerは、ルートコンテキストをロードし、他のすべてのコンテキストで可視なSpringビーンの設定を定義するために使用されるリスナークラスです。これはweb.xmlファイルで次のように構成されます:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
32. Spring MVCアプリケーションを作成するために必要な最小の設定は何ですか?
シンプルなSpring MVCアプリケーションを作成するには、次のタスクを実行する必要があります。
- プロジェクトに
spring-context
とspring-webmvc
の依存関係を追加します。 DispatcherServlet
をweb.xmlファイルで設定し、Springコンテナを通じてリクエストを処理するようにします。- Springのビーンの定義には、Springのビーン設定ファイルを使用します。アノテーションを使用する場合、ここで設定する必要があります。また、ビューページのためにビューリゾルバを設定する必要があります。
- クライアントのリクエストを処理するために、リクエストマッピングが定義されたコントローラクラスが必要です。
上記の手順で、シンプルなSpring MVC Hello Worldアプリケーションを作成するのに十分です。
33. Spring MVCフレームワークをMVCアーキテクチャに関連付けるにはどうすればよいですか?
Spring MVCは、その名前からもわかるように、Model-View-Controllerアーキテクチャの上に構築されています。 DispatcherServlet
は、Spring MVCアプリケーションのフロントコントローラであり、すべての受信リクエストを処理し、異なるコントローラハンドラメソッドに委任します。
モデルは、Springフレームワーク内の他のMVCフレームワークと同様に、任意のJava Beanを使用できます。フォームデータの自動バインディングを提供します。モデルビーンをビューページで使用するために属性として設定できます。
ビューページは、JSP、静的HTMLなどであることができます。ビューリゾルバは、正しいビューページを見つける責任があります。ビューページが特定されると、制御はDispatcherServletコントローラに戻されます。DispatcherServletはビューをレンダリングし、最終的な応答をクライアントに返します。
34. Spring MVCアプリケーションでのローカリゼーションの実現方法
Springは、リソースバンドルを通じて優れたローカリゼーションまたはi18nのサポートを提供しています。アプリケーションをローカライズするために必要な基本的な手順は次のとおりです:
- 異なるロケール(messages_en.properties、messages_fr.propertiesなど)用のメッセージリソースバンドルを作成します。
- spring beanの設定ファイルで、ResourceBundleMessageSourceまたはReloadableResourceBundleMessageSourceのタイプのmessageSource beanを定義します。
- ロケールの変更サポートのために、CookieLocaleResolverのタイプのlocaleResolver beanを定義し、LocaleChangeInterceptorインターセプターを構成します。次に示す例の構成方法を使用します:
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<beans:property name="defaultLocale" value="en" />
<beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
<beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="locale" />
</beans:bean>
</interceptors>
- ビューページで
spring:message
要素を使用し、キー名を指定します。DispatcherServletは対応する値を選択し、対応するロケールでページをレンダリングして応答として返します。
完全な例については、Spring Localization Exampleを参照してください。
35. Springを使用してJSONレスポンスを返すRestful Webサービスを作成する方法は?
Springフレームワークを使用して、JSONデータを返すRestful Webサービスを作成することができます。SpringはJackson JSON APIとの統合を提供しており、Restful WebサービスでJSONレスポンスを送信するために使用できます。
Spring MVCアプリケーションをJSONレスポンスを送信するように構成するためには、以下の手順を実行する必要があります。
1. Jackson JSONの依存関係を追加します。Mavenを使用している場合、以下のコードを使用して追加することができます:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
2. spring beanの設定ファイルでRequestMappingHandlerAdapter beanを構成し、message convertersプロパティをMappingJackson2HttpMessageConverter beanに設定します。サンプルの構成は次のようになります:
<!-- メソッドハンドラーでJSONを要求と応答としてプラグインするために構成する -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- JSONをPOJOに変換し、逆に変換するためのbeanを構成する -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
3. コントローラーハンドラーメソッドで、@ResponseBody
アノテーションを使用してオブジェクトをレスポンスとして返します。サンプルコード:
@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
logger.info("Start getEmployee. ID="+empId);
return empData.get(empId);
}
4. 任意のAPIを使用してレストサービスを呼び出すことができますが、Springを使用する場合はRestTemplateクラスを使用することが簡単です。
完全な例については、Spring Restful Webservice Exampleをお読みください。
36. あなたが使用した重要なSpringの注釈は何ですか?
私のプロジェクトで使用したSpringの注釈の一部は次のとおりです:
- @Controller – Spring MVCプロジェクトのコントローラークラスに使用します。
- @RequestMapping – コントローラーハンドラーメソッドのURIマッピングを構成するために使用します。これは非常に重要な注釈ですので、Spring MVC RequestMapping Annotation Examplesを確認してください。
- @ResponseBody – 通常はXMLまたはJSONデータを応答として送信するために、オブジェクトを応答として送信するために使用します。
- @PathVariable – URIからハンドラーメソッドの引数に動的な値をマッピングするために使用します。
- @Autowired – Springビーンでの依存関係の自動ワイヤリングに使用。
- @Qualifier – @Autowiredアノテーションと共に使用し、複数のインスタンスが存在する場合の混乱を避けるために使用。
- @Service – サービスクラスに使用。
- @Scope – Springビーンのスコープを設定するために使用。
- @Configuration、@ComponentScan、および @Bean – Javaベースの設定のために使用。
- アスペクトとアドバイスの設定のためのAspectJアノテーション、@Aspect、@Before、@After、@Around、@Pointcutなど。
37. Controllerハンドラメソッドの応答としてオブジェクトを送信できますか?
はい、@ResponseBodyアノテーションを使用することで可能です。これにより、RESTful WebサービスでJSONまたはXMLベースの応答を送信できます。
38. Spring MVCアプリケーションでファイルをアップロードする方法は?
Springは、MultipartResolverインターフェースの実装を介してファイルのアップロードをサポートしています。非常に簡単に使用でき、動作させるためには設定の変更のみが必要です。受信したファイルを処理するために、コントローラのハンドラメソッドを記述する必要があります。完全な例については、Springファイルアップロードの例を参照してください。
39. Spring Web MVCフレームワークでフォームデータをバリデーションする方法は?
SpringはJSR-303アノテーションベースのバリデーションをサポートしており、独自のカスタムバリデータを作成するために実装できるValidatorインターフェースも提供しています。
JSR-303ベースのバリデーションを使用するには、必要なバリデーションでbean変数にアノテーションを付ける必要があります。Spring MVCフォームバリデーションの例を完全な例として参照してください。
40. Spring MVCインターセプターとは何か、そしてそれを使用する方法は?
Spring MVCインターセプターは、Servletフィルタのようなものであり、クライアントのリクエストをインターセプトして処理することができます。クライアントのリクエストをpreHandle、postHandle、afterCompletionの3つの場所でインターセプトすることができます。
HandlerInterceptorインターフェースを実装するか、抽象クラスHandlerInterceptorAdapterを拡張することで、Springインターセプターを作成することができます。
SpringのBean設定ファイルでインターセプタを構成する必要があります。クライアントのリクエストをインターセプトするためのインターセプタを定義することもできますし、特定のURIマッピングに対しても構成することができます。詳細な例については、Spring MVC インターセプタの例を参照してください。
41. SpringのJdbcTemplateクラスとは何ですか?それを使用する方法は?
Spring FrameworkはJDBC APIとの優れた統合を提供し、データベース操作ロジック(接続の開閉、ResultSet、PreparedStatementなど)からボイラープレートコードを排除するためにJdbcTemplateユーティリティクラスを提供しています。
JdbcTemplateの例については、Spring JDBCの例を参照してください。
42. Spring WebアプリケーションでTomcat JNDIデータソースを使用する方法は?
サーブレットコンテナが設定されたJNDIデータソースを使用するためには、それをSpringのbean構成ファイルで設定し、それをSpringのbeanに依存関係として注入する必要があります。その後、JdbcTemplate
を使用してデータベース操作を行うことができます。
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
完全な例については、Spring Tomcat JNDI Exampleを参照してください。
43. Springでトランザクション管理をどのように実現しますか?
Springフレームワークは、宣言的トランザクション管理とプログラムによるトランザクション管理の両方をサポートしています。宣言的トランザクション管理は、使いやすく、ほとんどの場合に動作するため、最も広く使用されています。
宣言的トランザクション管理では、メソッドに@Transactional
アノテーションを付けます。また、springのbean構成ファイルで、データソースのためのトランザクションマネージャを設定する必要があります。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
44. Spring DAOとは何ですか?
Spring DAOサポートは、JDBCやHibernateなどのデータアクセス技術との一貫性のある簡単な方法での作業を提供します。例えば、JdbcDaoSupport、HibernateDaoSupport、JdoDaoSupport、JpaDaoSupportなどがあります。
Spring DAOは例外の階層にも一貫性を提供しており、特定の例外をキャッチする必要はありません。
45. SpringとHibernateフレームワークを統合する方法は?
Spring ORMモジュールを使用してSpringとHibernateフレームワークを統合することができます。Hibernate 3+を使用している場合、SessionFactoryが現在のセッションを提供するため、HibernateTemplateやHibernateDaoSupportクラスの使用は避け、依存性注入を使用したDAOパターンを使用することがより良いでしょう。
Spring ORMはSpringの宣言的トランザクション管理のサポートも提供しているため、Hibernateのトランザクション管理のためのボイラープレートコードを使用する代わりに、それを利用すべきです。
理解を深めるために、以下のチュートリアルを参照してください:
46. Spring Securityとは何ですか?
Spring Securityフレームワークは、Javaアプリケーションにおける認証と認可の両方を提供することに焦点を当てています。また、CSRF攻撃などの一般的なセキュリティの脆弱性にも対処します。
Spring Securityを使用することは非常に便利であり、@EnableWebSecurity
などのアノテーションを使用することによって、Webアプリケーションで簡単に利用することができます。Spring Securityフレームワークの使用方法については、以下の記事を参照してください。
47. java.util.PropertiesをSpring Beanにインジェクトする方法は?
指定されたプロパティファイルからプロパティをロードするpropertyConfigurerビーンを定義する必要があります。その後、Spring ELのサポートを使用して他のビーンの依存関係にプロパティをインジェクトすることができます。例えば:
<bean id="propertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="/WEB-INF/application.properties" />
</bean>
<bean class="com.journaldev.spring.EmployeeDaoImpl">
<property name="maxReadResults" value="${results.read.max}"/>
</bean>
Springフレームワークでは、アノテーションを使用してスプリングビーンを構成する場合、以下のようにプロパティをインジェクトすることができます。
@Value("${maxReadResults}")
private int maxReadResults;
Springフレームワークで使用されるデザインパターンのいくつかを挙げてください。
Springフレームワークは多くのデザインパターンを使用しており、一部の一般的なものは次のとおりです:
- シングルトンパターン:デフォルトスコープのビーンの作成
- ファクトリーパターン:Bean Factoryクラス
- プロトタイプパターン:ビーンのスコープ
- アダプターパターン:Spring WebとSpring MVC
- プロキシパターン:Springのアスペクト指向プログラミングサポート
- テンプレートメソッドパターン:JdbcTemplate、HibernateTemplateなど
- フロントコントローラー:Spring MVCのDispatcherServlet
- データアクセスオブジェクト:Spring DAOサポート
- 依存性の注入とアスペクト指向プログラミング
49. Spring Frameworkのベストプラクティスにはどのようなものがありますか?
Spring Frameworkのベストプラクティスのいくつかは次のとおりです:
- 最新の設定を持つために、スキーマ参照にバージョン番号を記載しないようにすること。
- spring-jdbc.xml、spring-security.xmlなど、関心ごとに基づいてSpringビーンの設定を分割すること。
- Spring MVCで複数のコンテキストで使用されるSpringビーンの場合は、ルートコンテキストで作成し、リスナーで初期化すること。
- 可能な限りビーンの依存関係を設定し、できるだけ自動ワイヤリングを避けること。
- アプリケーションレベルのプロパティの場合、プロパティファイルを作成し、Springビーンの設定ファイルで読み込むのが最善のアプローチです。
- 小規模なアプリケーションの場合、アノテーションは便利ですが、大規模なアプリケーションの場合、アノテーションは手間になることがあります。すべての設定をXMLファイルで管理すると、メンテナンスが容易になります。
- コンポーネントを理解しやすくするために、正しい注釈を使用してください。サービスには@Service、DAOビーンには@Repositoryを使用してください。
- Springフレームワークには多くのモジュールがありますので、必要なものを使用してください。Spring Tool Suiteのテンプレートを使用してプロジェクトを作成する際に通常追加される余分な依存関係を削除してください。
- アスペクトを使用している場合、望ましくないメソッドに対してアドバイスが適用されないように、ジョインポイントをできるだけ狭く保ってください。使用しやすく問題を回避するためにカスタムアノテーションを検討してください。
- 実際の利益がある場合にのみ依存性注入を使用してください。疎結合のためだけに使用するのではなく、保守性が向上するために使用してください。
50. Spring Bootとは何ですか?
Spring Bootは、Springフレームワークをユニークにする要素です。これにより、さまざまなタイプのJavaアプリケーションを簡単に作成し、サーブレットコンテナの実行環境に結び付けることができます。その結果、プロジェクトを実行するために実行できる単一のJARファイルを取得することができます。これにより、製品の展開にすぐに利用できるスケルトンプロジェクトを簡単に取得でき、多くの時間を節約することができます。これにより、コードのビルド、それをサーブレットコンテナに展開する一般的なプロセスを経る代わりに、ビジネスロジックにより集中することができます。非常に広範なトピックですので、Spring Bootのインタビューの質問をご覧ください。
Spring Frameworkのインタビューの質問は以上です。これらの質問がJava EEのインタビューで役立つことを願っています。見つけ次第、質問リストに追加していきますので、もしご存知の質問があれば、コメントに追加してください。
Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers