春のインタビューの質問と回答

最近、私はたくさんのSpringチュートリアルを投稿しました。この記事は、Springのインタビューでの質問に詳しく説明を加え、基本概念を理解するのに役立つでしょう。

Spring Frameworkは、Webアプリケーションのための最も人気のあるJava EEフレームワークの1つです。依存性の注入と面向けプログラミングは、Springフレームワークの要点です。もしSpring Frameworkによく精通しているなら、Javaの面接で選ばれる可能性は非常に高くなります。

プロのヒント:Core Javaは、どんなJavaベースのフレームワークの基盤となるため、面接の準備をしている場合は、Core Javaのインタビューの質問とJavaのインタビューの質問の記事を読んでください。

春の面接の質問と回答

ここでは、ほぼ50の春の面接質問とその回答を提供しています。Spring 5まで最新情報を提供しているため、Spring WebFluxなどの最新機能もカバーしています。

1. Spring Frameworkとは何ですか?

スプリングは、Java EEフレームワークの中でも最も広く利用されているものの一つです。スプリングフレームワークの主要なコンセプトは、「依存性注入」と「アスペクト指向プログラミング」です。

Springフレームワークを通じて、通常のJavaアプリケーションでも異なるコンポーネント間の緩い結合を実現するために依存性注入を実装することができます。Springのアスペクト指向プログラミングのサポートを使用することで、ログ記録や認証などのクロスカッティングタスクを実行することもできます。

私は春が好きです。なぜなら、Spring MVCやSpring JDBCなど、特定のタスクに適した多くの機能やモジュールを提供しているからです。オープンソースのフレームワークであり、オンラインのリソースも豊富で、活発なコミュニティメンバーもいますので、Springフレームワークと一緒に作業することは簡単で楽しいです。

おすすめの読み物:Spring Framework

2. Spring Frameworkの重要な特徴は何ですか? (Spring Framework no juuyou na tokucho wa nan desu ka?)

スプリングフレームワークは、2つのデザインコンセプト、依存性の注入とアスペクト指向プログラミングを基に構築されています。

Springフレームワークの特徴には、以下があります:

  • Lightweight and very little overhead of using a framework for our development.
  • Dependency Injection or Inversion of Control to write components that are independent of each other, spring container takes care of wiring them together to achieve our work.
  • Spring IoC container manages Spring Bean life cycle and project-specific configurations such as JNDI lookup.
  • Spring MVC framework can be used to create web applications as well as restful web services capable of returning XML as well as JSON response.
  • Support for transaction management, JDBC operations, File uploading, Exception Handling, etc with very few configurations, either by using annotations or by spring bean configuration file.

3. Spring Frameworkの利点は何ですか? (Spring Frameworkのりてんはなんですか?)

Spring Frameworkの利点の一部は次のとおりです:

  • Reducing direct dependencies between different components of the application. Spring IoC container is responsible for initializing resources or beans and inject them as dependencies.
  • Writing unit test cases are easy in the Spring framework because our business logic doesn’t have direct dependencies with actual resource implementation classes. We can easily write a test configuration and inject our mock beans for testing purposes.
  • Reduces the amount of boiler-plate code, such as initializing objects, open/close resources. I like JdbcTemplate class a lot because it helps us in removing all the boiler-plate code that comes with JDBC programming.
  • Spring framework is divided into several modules, it helps us in keeping our application lightweight. For example, if we don’t need Spring transaction management features, we don’t need to add that dependency to our project.
  • Spring framework supports most of the Java EE features and even much more. It’s always on top of the new technologies, for example, there is a Spring project for Android to help us write better code for native Android applications. This makes the spring framework a complete package and we don’t need to look after the different frameworks for different requirements.

Spring 5の重要な機能は何ですか?

Spring 5はSpring 4からの大規模な改修です。重要な機能のいくつかは以下の通りです。

  • Support for Java 8 and higher versions, so we can use lambda expressions.
  • Support for Java EE7 and Servlet 4.0 specs.
  • File operations are performed via NIO 2 streams now, a huge improvement if your app does a lot of file handling.
  • Introduction of spring-jcl to streamline logging, earlier it was a mess due to no single point for logging purposes.
  • Support for Kotlin, Lombok, Reactor 3.1 Flux, and Mono as well as RxJava.
  • Spring WebFlux that brings reactive programming to Spring.
  • Support for JUnit 5
  • Support for providing spring components information through index file “META-INF/spring.components” rather than classpath scanning.

このリリースの詳細な概要を把握するために、Spring 5の特徴についてご確認ください。

5. Spring WebFluxとは何ですか? (Spring WebFlux to wa nan desu ka?)

Spring WebFluxは、Spring 5で導入された新しいモジュールです。Spring WebFluxは、Springフレームワークでの反応型プログラミングモデルへの最初のステップです。

Spring WebFluxは、Spring MVCモジュールの代替となるものです。Spring WebFluxは、イベントループの実行モデルに基づいて構築された完全非同期かつ非ブロッキングのアプリケーションを作成するために使用されます。

「Spring WebFlux チュートリアルでは、それに関してもっと詳しく読むことができます。」

6. 依存性注入とはどのように理解していますか?

依存性注入デザインパターンにより、ハードコーディングされた依存関係を除去し、アプリケーションを疎結合、拡張可能、保守しやすくすることができます。依存性の解決をコンパイル時からランタイムに移動するため、依存性注入パターンを実装することができます。

依存性注入の利点の一部として、関心の分離、煩雑なコードの削減、設定可能なコンポーネント、そして簡単なユニットテストが挙げられます。

「依存性注入チュートリアル」を読んで詳しく調べることができます。依存性注入のプロセスを自動化するために、Google Guiceも利用することができます。しかし、一般的には依存性注入以上の機能を求める場合が多く、その点でSpringが最適となります。

7. スプリングフレームワークでDIを実装するには、どのようにすれば良いですか?

私たちは、SpringアプリケーションでDIを実装するために、Spring XMLベースとアノテーションベースの設定の両方を使用することができます。より深い理解のために、SpringのDependency Injectionの例を読んでください。そこでJUnitテストケースとともに両方の方法を学ぶことができます。また、投稿にはサンプルプロジェクトのZIPファイルも含まれており、さらに学ぶためにダウンロードして試すことができます。

8. Spring Tool Suiteを使用する利点は何ですか?

Eclipseにプラグインをインストールすることで、Spring Tool Suiteのすべての機能を利用することができます。ただし、STSにはMavenサポートや異なる種類のSpringプロジェクトを作成するためのテンプレート、Springアプリケーションのパフォーマンスを向上させるためのtc serverなど、重要な機能が含まれています。

私はSTSが好きです。なぜなら、STSはSpringのコンポーネントを強調して表示してくれるからです。もしAOPのポイントカットとアドバイスを使用している場合、どのメソッドが特定のポイントカットの下に入るのか明確に示してくれます。だから、自分ですべてをインストールするよりも、私はSpringベースのアプリケーションを開発する際にSTSを使うことを好みます。

9. 重要なSpringのモジュールの中で名前を挙げてください。

重要なSpring Frameworkのモジュールのうちいくつかは以下のとおりです。

  • Spring Context – for dependency injection.
  • Spring AOP – for aspect-oriented programming.
  • Spring DAO – for database operations using DAO pattern
  • Spring JDBC – for JDBC and DataSource support.
  • Spring ORM – for ORM tools support such as Hibernate
  • Spring Web Module – for creating web applications.
  • Spring MVC – Model-View-Controller implementation for creating web applications, web services, etc.

10. アスペクト指向プログラミングとは何ですか? (Asupekuto shikō puroguramingu to wa nan desu ka?)

エンタープライズアプリケーションには、ログ、トランザクション管理、データ検証、認証など、さまざまな種類のオブジェクトとアプリケーションモジュールに適用可能な共通のクロスカットの関心事があります。 オブジェクト指向プログラミングでは、アプリケーションのモジュール性はクラスによって達成されます。 一方、AOPでは、アプリケーションのモジュール性をアスペクトによって達成し、異なるクラスメソッドにまたがるように設定されます。

AOPは通常のオブジェクト指向プログラミングでは不可能な、横断的なタスクへの直接の依存性をクラスから取り除きます。例えば、ログ記録のために別のクラスを持つことができますが、他のクラスはこれらのメソッドを呼び出さなければなりません。しかし、AOPではアスペクトを設定し、メソッドの実行が自動的に行われます。Spring AOPのサポートについて詳しくは、Spring AOPの例をご覧ください。

11. AOPにおけるAspect、Advice、Pointcut、JointPoint、Advice Argumentsとは何ですか?

アスペクト: アスペクトは、トランザクション管理などのクロスカット懸念事項を実装するためのクラスです。アスペクトは、通常のクラスとして構成され、Spring Beanの設定ファイルで構成することもできます。また、@Aspectアノテーションを使用してクラスをアスペクトとして宣言するためにSpring AspectJサポートを使用することもできます。

アドバイス:アドバイスは特定のジョインポイントに対して行われるアクションです。プログラミングの観点から見ると、それはアプリケーションで特定のジョインポイントに到達した時に実行されるメソッドです。アドバイスは、SpringのインターセプターやServletフィルターと同様に考えることができます。

ポイントカット:ポイントカットは、アドバイスが実行されるかどうかを決定するために、ジョインポイントと一致させる正規表現です。ポイントカットは、ジョインポイントと一致する異なる種類の式を使用します。Springフレームワークでは、アドバイスメソッドが適用されるジョインポイントを決定するために、AspectJのポイントカット式言語を使用しています。

JoinPoint(接合点)とは、アプリケーション内の特定のポイントを指し、例えばメソッドの実行、例外処理、オブジェクト変数の値の変更などが挙げられます。Spring AOPにおいては、接合点は常にメソッドの実行を指します。

アドバイスの引数: アドバイスメソッドに引数を渡すことができます。 args()の表現をポイントカットに使用し、引数のパターンに一致するメソッドに適用することができます。これを使用する場合、引数の型が確定するアドバイスメソッドで同じ名前を使用する必要があります。

最初はこれらの概念は混乱しているように見えますが、Springのアスペクト、アドバイス、例を通じて進めば、簡単に関連付けることができます。

12. Spring AOPとAspectJ AOPの違いは何ですか?

AspectJはアスペクト指向プログラミングの産業標準実装であり、一方のSpringは一部のケースにおいてAOPを実装しています。Spring AOPとAspectJの主な違いは次の通りです。

  • Spring AOP is simpler to use than AspectJ because we don’t need to worry about the weaving process.
  • Spring AOP supports AspectJ annotations, so if you are familiar with AspectJ then working with Spring AOP is easier.
  • Spring AOP supports only proxy-based AOP, so it can be applied only to method execution join points. AspectJ support all kinds of pointcuts.
  • One of the shortcomings of Spring AOP is that it can be applied only to the beans created through Spring Context.

13. Spring IoC コンテナとは何ですか?

制御反転(IoC)は、オブジェクト間の緩い結合を実現するメカニズムです。ランタイム時にオブジェクトの結合を緩め、動的なバインディングを実現するために、オブジェクトは、他の組み立てオブジェクトによって注入される依存関係を定義します。Spring IoCコンテナは、依存関係をオブジェクトに注入し、私たちが使用できるように準備します。

Spring FrameworkのIoCコンテナクラスは、org.springframework.beansおよびorg.springframework.contextパッケージの一部であり、オブジェクトの依存関係を切り離すためのさまざまな方法を提供しています。

私たちが使用するいくつかの便利なApplicationContextの実装は、次のとおりです。

  • AnnotationConfigApplicationContext: For standalone java applications using annotations-based configuration.
  • ClassPathXmlApplicationContext: For standalone java applications using XML-based configuration.
  • FileSystemXmlApplicationContext: Similar to ClassPathXmlApplicationContext except that the XML configuration file can be loaded from anywhere in the file system.
  • AnnotationConfigWebApplicationContext and XmlWebApplicationContext for web applications.

14. スプリング・ビーンとは何ですか? (Supuringu Bīn to wa nan desu ka?)

Spring IoCコンテナによって初期化される、通常のJavaクラスはSpring Beanと呼ばれます。Spring Beanのインスタンスを取得するために、Spring ApplicationContextを使用します。

Spring IoC コンテナは、Spring Beanのライフサイクル、Beanのスコープ、およびBeanに必要な依存関係のインジェクションを管理します。

15. スプリングのビーンの設定ファイルの重要性は何ですか? (Supuringu no biin no settei fairu no juuyousei wa nan desu ka?)

私たちは、Springコンテキストによって初期化されるすべてのビーンを定義するために、Spring Beanの設定ファイルを使用します。Spring ApplicationContextのインスタンスを作成すると、spring beanのXMLファイルを読み込んですべてのビーンを初期化します。コンテキストが初期化されると、異なるビーンのインスタンスを取得するために使用できます。

春のビーンの設定以外にも、このファイルにはSpring MVCインターセプタ、ビューリゾルバ、およびアノテーションベースの設定をサポートする他の要素も含まれています。

クラスをSpring Beanとして設定するさまざまな方法は何ですか?

Spring Beanを設定する方法は3つあります。

XML設定:これは最も人気のある設定であり、Spring Beanを設定するためにコンテキストファイル内のbean要素を使用できます。例えば:

<bean name="myBean" class="com.scdev.spring.beans.MyBean"></bean>

Javaベースの設定:もしアノテーションのみを使用している場合、@Beanアノテーションを使ってSpringのビーンを設定することができます。このアノテーションは@Configurationクラスと共に使用され、Springのビーンを設定します。サンプルの設定は以下の通りです。

@Configuration
@ComponentScan(value="com.scdev.spring.main")
public class MyConfiguration {

	@Bean
	public MyService getService(){
		return new MyService();
	}
}

この豆をSpringコンテキストから取得するには、以下のコードスニペットを使用する必要があります。

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
		MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);

アノテーションベースの設定:@Component、@Service、@Repository、@Controllerのアノテーションをクラスに使用して、それらをSpringのビーンとして設定することもできます。これらの場合、これらのクラスをスキャンするためのベースパッケージの場所を指定する必要があります。例えば:

<context:component-scan base-package="com.scdev.spring" />

17. Spring Bean の異なるスコープは何ですか? (Spring Bean no kotonaru sukōpu wa nan desu ka?)

Spring Beansには、5つのスコープが定義されています。

    1. シングルトン:コンテナごとに1つのインスタンスのみが作成されます。これはSpringビーンのデフォルトのスコープです。このスコープを使用する際には、Springビーンに共有インスタンス変数がないことを確認してください。そうでない場合、スレッドセーフではないため、データの不整合の問題が発生する可能性があります。

プロトタイプ:ビーンが要求される度に新しいインスタンスが作成されます。

リクエスト:これはプロトタイプスコープと同じですが、ウェブアプリケーションで使用するためのものです。HTTPリクエストごとに新しいビーンのインスタンスが作成されます。

セッション:コンテナによって、各HTTPセッションごとに新しいビーンが作成されます。

グローバルセッション:これはポートレットアプリケーション用のグローバルセッションビーンを作成するために使用されます。

Spring Frameworkは拡張可能であり、自分自身のスコープも作成できます。ただし、ほとんどの場合、フレームワークが提供するスコープで十分です。Springのビーンのスコープを設定するには、bean要素の”scope”属性または注釈ベースの設定に対する@Scope注釈を使用できます。

18. スプリング・ビーンのライフサイクルは何ですか? (Supuringu bīn no raifusaikuru wa nan desu ka?)

SpringコンテナによってSpringのビーンが初期化され、すべての依存関係が注入されます。コンテキストが破棄されると、初期化されたすべてのビーンも破棄されます。これは大抵の場合でうまく動作しますが、時にはビーンを使用可能にする前に他のリソースの初期化や検証を行いたいことがあります。Springフレームワークでは、ビーンのポスト初期化メソッドとプリデストロイメソッドをサポートしています。

これは2つの方法で行うことができます – InitializingBeanとDisposableBeanインターフェースを実装するか、Springビーンの設定でinit-methodとdestroy-method属性を使用する方法です。詳細については、「Springビーンのライフサイクルメソッド」をお読みください。

19. Spring Bean内でServletContextとServletConfigオブジェクトを取得する方法はありますか?

Springのビーン内で、Container固有のオブジェクトを取得する方法は2つあります。

  • Implementing Spring *Aware interfaces, for these ServletContextAware and ServletConfigAware interfaces, for a complete example of these aware interfaces, please read Spring Aware Interfaces.
  • Using @Autowired annotation with bean variable of type ServletContext and ServletConfig. They will work only in servlet container-specific environments only.
@Autowired
ServletContext servletContext;

20. ビーンワイヤリングと@Autowiredアノテーションとは何ですか?

初期化時にSpring Beanの依存関係を注入するプロセスをSpring Bean Wiringと呼びます。

通常、すべてのBeanの依存関係の明示的な配線を行うのがベストプラクティスですが、Springフレームワークはまた、オートワイヤリングもサポートしています。私たちは、@Autowiredアノテーションをフィールドやメソッドに使用して、byTypeでのオートワイヤリングを行うことができます。このアノテーションが機能するためには、Spring Beanの設定ファイルでアノテーションベースの構成を有効にする必要もあります。これは、context:annotation-config要素によって実行できます。

@Autowiredアノテーションに関する詳細は、Spring Autowire Exampleをお読みください。

21. スプリングビーンのオートワイヤリングには、どのような異なるタイプがありますか?

Springフレームワークには、4つのタイプのオートワイヤリングがあります。

    1. byNameによるオートワイヤリング

 

    1. byTypeによるオートワイヤリング

 

    1. コンストラクタによるオートワイヤリング

 

    @Autowiredと@Qualifierアノテーションによるオートワイヤリング

Spring 3.1より前では、autowire by autodetectという同様の機能がautowire by constructorやbyTypeと同様にサポートされていました。これらのオプションの詳細については、Spring Bean Autowiringをお読みください。

22. スプリングのビーンはスレッドセーフを提供していますか? (Supuringu no bīn wa sureddo sēfu o teikyō shiteimasu ka?)

Springビーンのデフォルトスコープはシングルトンですので、コンテキストごとに1つのインスタンスしか存在しません。したがって、どのスレッドでも更新できるクラスレベルの変数を持つと、データの整合性が保たれなくなる可能性があります。そのため、デフォルトモードではSpringビーンはスレッドセーフではありません。

しかしながら、スレッドセーフを保証するために、パフォーマンスの犠牲を払ってスプリングビーンのスコープをリクエスト、プロトタイプ、またはセッションに変更することができます。これは設計上の決定であり、プロジェクトの要件に基づいています。

23. Spring MVCにおけるControllerとは何ですか?

MVCデザインパターンと同様に、コントローラーはすべてのクライアントのリクエストを処理し、それらを設定されたリソースに送信して処理するクラスです。Spring MVCでは、DispatcherServletがフロントコントローラークラスであり、Spring Beanの設定に基づいてコンテキストを初期化します。

Controllerクラスは、リクエストマッピングに基づいて異なる種類のクライアントリクエストを処理する責任があります。@Controllerアノテーションを使用して、コントローラクラスを作成することができます。通常、特定のURIマッピングのハンドラメソッドを定義するために@RequestMappingアノテーションと一緒に使用されます。

「@Component」、「@Controller」、「@Repository」、「@Service」というアノテーションはSpringにおける違いは何ですか?

@Componentはクラスがコンポーネントであることを示すために使用されます。これらのクラスは自動検出のために使用され、アノテーションベースの設定でBeanとして構成されます。

@Controllerは、MVCアプリケーションで使用される特定のコンポーネントであり、主にRequestMappingのアノテーションと一緒に使用されます。

@Repositoryアノテーションは、コンポーネントがリポジトリとして使用され、データの保存・取得・検索のためのメカニズムとして使用されることを示すために使用されます。このアノテーションは、DAOパターンの実装クラスに適用することができます。

@Serviceは、クラスがサービスであることを示すために使用されます。通常、いくつかのサービスを提供するビジネスファサードクラスには、これがアノテーションされています。

私たちは、自動検出のために上記の注釈のいずれかをクラスに使用することができますが、異なるタイプが提供されているため、注釈付けされたクラスの目的を簡単に区別することができます。

DispatcherServletとContextLoaderListenerとは何ですか?

DispatcherServletはSpring MVCアプリケーションにおけるフロントコントローラーであり、spring beanの設定ファイルを読み込み、設定されたすべてのbeanを初期化します。また、アノテーションが有効になっている場合、パッケージをスキャンし、@Component、@Controller、@Repository、または@Serviceアノテーションが付けられたbeanを構成します。

ContextLoaderListenerは、SpringのルートのWebApplicationContextを起動およびシャットダウンするためのリスナーです。重要な機能は、ApplicationContextのライフサイクルをServletContextのライフサイクルに結びつけ、ApplicationContextの作成を自動化することです。異なるSpringコンテキスト間で使用することができる共有のBeanを定義するために使用することができます。

26. SpringにおけるViewResolverとは何ですか?

ViewResolver実装は、ビューページを名前で解決するために使用されます。私たちは、それをSpringのbean設定ファイルで設定します。例えば:

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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インターフェースの一つの実装であり、ビーンのプロパティを通じてビューページのディレクトリと接尾辞の位置を提供しています。したがって、コントローラーハンドラーメソッドが「home」を返す場合、ビューリゾルバは/WEB-INF/views/home.jspに配置されたビューページを使用します。

27. MultipartResolverとは何ですか?いつ使用されますか?

MultipartResolverインターフェースは、ファイルのアップロードに使用されます。コモンズマルチパートリゾルバーとスタンダードサーブレットマルチパートリゾルバーは、Springフレームワークが提供する2つの実装です。デフォルトでは、マルチパートリゾルバーは設定されていませんが、ファイルのアップロードに使用するためには、Spring Beanの設定でタイプをMultipartResolverとして名前が「multipartResolver」のビーンを定義する必要があります。

設定が完了すると、マルチパートのリクエストは設定されたMultipartResolverによって処理され、ラップされたHttpServletRequestが渡されます。それから、それがコントローラクラスで使用されてファイルを取得し、処理されます。完全な例については、Spring MVCファイルのアップロードの例を参照してください。

28. Spring MVCフレームワークにおける例外の扱い方はどうですか?

Spring MVCフレームワークは、強固な例外処理を実現するための以下の方法を提供しています。

コントローラーベース – コントローラークラス内に例外ハンドラーメソッドを定義することができます。これらのメソッドには、@ExceptionHandlerアノテーションを付けるだけで良いです。

グローバルな例外ハンドラー – 例外処理は横断的な関心事であり、Springではどのクラスでも使用できる@ControllerAdvice注釈を提供しています。これを使用して、グローバルな例外ハンドラーを定義することができます。

日本語での表現例:
HandlerExceptionResolverの実装 – 一般的な例外に対しては、ほとんどの場合、静的なページを提供します。Spring FrameworkにはHandlerExceptionResolverインタフェースがあり、これを実装してグローバルな例外ハンドラを作成することができます。グローバルな例外ハンドラを定義するためのこの追加方法の理由は、Spring Frameworkがデフォルトの実装クラスも提供しており、springのbean設定ファイルで定義すれば、springの例外処理の利点が得られるからです。

完全な例については、Springの例外処理の例をお読みください。

29. JavaプログラムでApplicationContextを作成する方法はどのようなものですか?

スタンドアロンのJavaプログラムでSpringのコンテキストを作成する方法は、以下のようになります。

    1. AnnotationConfigApplicationContext: スプリングを単独のJavaアプリケーションで使用し、設定に注釈を使用している場合、このクラスを使用してコンテナを初期化し、ビーンオブジェクトを取得することができます。

 

    1. ClassPathXmlApplicationContext: スプリングビーンの設定XMLファイルが単独のアプリケーション内にある場合、このクラスを使用してファイルをロードし、コンテナオブジェクトを取得することができます。

 

    FileSystemXmlApplicationContext: これはClassPathXmlApplicationContextと似ていますが、XML設定ファイルをファイルシステムのどこからでもロードすることができます。

30. 私たちは複数のSpringの設定ファイルを使用することはできますか? (Watashitachi wa fukusū no Spring no settei fairu wo shiyō suru koto wa dekimasu ka?)

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アプリケーションを作成するためには、以下のタスクを実行する必要があります。

  • Add spring-context and spring-webmvc dependencies in the project.
  • Configure DispatcherServlet in the web.xml file to handle requests through the spring container.
  • Spring bean configuration file to define beans, if using annotations then it has to be configured here. Also, we need to configure the view resolver for view pages.
  • Controller class with request mappings defined to handle the client requests.

以上の手順で簡単なSpring MVC Hello Worldアプリケーションを作成するのに十分です。

33. Spring MVCフレームワークをMVCアーキテクチャにどのように関連付けますか?

Spring MVCは、その名前が示すようにModel-View-Controllerアーキテクチャの上に構築されています。DispatcherServletはSpring MVCアプリケーションのフロントコントローラであり、すべての受信リクエストを処理し、それらを異なるコントローラーハンドラメソッドに委任します。

モデルはSpring FrameworkのJava Beanであればどんなものでも構いません。他のMVCフレームワークと同様に、Springではフォームデータを自動的にJava Beanにバインディングすることができます。私たちはモデルビーンを属性として設定し、ビューページで使用することができます。

ビューページはJSP、静的なHTMLなどであることができます。ビューリゾルバは正しいビューページを見つける責任を持っています。ビューページが特定されると、制御はDispatcherServletコントローラに戻されます。DispatcherServletはビューをレンダリングし、最終的な応答をクライアントに返す責任を持っています。

34. Spring MVCアプリケーションでのローカライゼーションの実現方法は何ですか? (34. Supuringu MVC apurikēshon de no rōkaraizeeshon no jitsugen hōhō wa nan desu ka?)

春は、リソースバンドルを通じて優れたローカライゼーションまたはi18nのサポートを提供しています。アプリケーションをローカライズするために必要な基本的な手順は次のとおりです。

  • Creating message resource bundles for different locales, such as messages_en.properties, messages_fr.properties, etc.
  • Defining messageSource bean in the spring bean configuration file of type ResourceBundleMessageSource or ReloadableResourceBundleMessageSource.
  • For a change of locale support, define localeResolver bean of type CookieLocaleResolver and configure LocaleChangeInterceptor interceptor. An example configuration is shown as follows:
<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>
  • Use spring:message element in the view pages with key names, DispatcherServlet picks the corresponding value and renders the page in corresponding locale and return as response.

完全な例については、「Springローカライゼーションの例」を読んでください。

35. Springを使ってJSONレスポンスを返すRestful Webサービスをどのように作成できますか?

私たちはSpring Frameworkを使用してJSONデータを返すRESTfulウェブサービスを作成することができます。SpringはJackson JSON APIとの統合を提供しており、このAPIを使用してRESTfulウェブサービスでJSON応答を送信することができます。

私たちは、Spring MVCアプリケーションのJSONレスポンス送信を設定するために以下の手順を実行する必要があります。

Mavenを使用している場合、次のコードでJackson JSONの依存関係を追加することができます。

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.databind-version}</version>
</dependency>

2. スプリングのビーン設定ファイルでRequestMappingHandlerAdapterビーンを設定し、message convertersプロパティをMappingJackson2HttpMessageConverterビーンに設定します。サンプルの設定は次のようになります。

<!-- Configure to plugin JSON as request and response in method handler -->
<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>
     
<!-- Configure bean to convert JSON to POJO and vice versa -->
<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の例をお読みください。

36. あなたが使用している重要なSpringのアノテーションは何ですか? (What are the important Spring annotations that you have used?)

私のプロジェクトで使用したSpringのアノテーションの一部は以下のとおりです:

  • @Controller – for controller classes in Spring MVC project.
  • @RequestMapping – for configuring URI mapping in controller handler methods. This is a very important annotation, so you should go through Spring MVC RequestMapping Annotation Examples
  • @ResponseBody – for sending Object as a response, usually for sending XML or JSON data as a response.
  • @PathVariable – for mapping dynamic values from the URI to handler method arguments.
  • @Autowired – for auto wiring dependencies in spring beans.
  • @Qualifier – with @Autowired annotation to avoid confusion when multiple instances of bean type are present.
  • @Service – for service classes.
  • @Scope – for configuring scope of the spring bean.
  • @Configuration, @ComponentScan, and @Bean – for java based configurations.
  • AspectJ annotations for configuring aspects and advice, @Aspect, @Before, @After, @Around, @Pointcut, etc.

37. コントローラーハンドラーメソッドの応答としてオブジェクトを送信できますか?

はい、@ResponseBodyアノテーションを使用することで可能です。これによって、レストフルなウェブサービスでJSONやXML形式のレスポンスを送信することができます。

38. Spring MVC アプリケーションでのファイルのアップロード方法は?

Springは、MultipartResolverインターフェースの実装を通じたファイルのアップロードをサポートしています。使い方は非常に簡単で、機能させるためには設定の変更だけが必要です。ファイルのアップロードを処理するために、コントローラーハンドラーメソッドを記述する必要があります。完全な例については、Springファイルアップロードの例を参照してください。

39. Spring Web MVC Frameworkでフォームデータを検証する方法は何ですか?

Springでは、JSR-303に基づいたアノテーションベースのバリデーションをサポートしており、独自のカスタムバリデータを作成するために実装できるValidatorインターフェースも提供しています。JSR-303に基づいたバリデーションを使用するためには、必要なバリデーションをビーン変数にアノテートする必要があります。

カスタムバリデータの実装には、コントローラークラスで設定する必要があります。完全な例については、「Spring MVCフォームバリデーションの例」をお読みください。

40. Spring MVC のインターセプターとは何ですか? どのように使用するのですか?

Spring MVCのインターセプターは、サーブレットフィルターのようなもので、クライアントのリクエストをフィルタリングおよび処理することができます。私たちは、preHandle、postHandle、およびafterCompletionの3つの場所でクライアントのリクエストをインターセプトすることができます。

ハンドラーインターセプターは、HandlerInterceptor インターフェースを実装するか、抽象クラス HandlerInterceptorAdapter を拡張することで作成できます。

私たちは、SpringのBean設定ファイルでインターセプターを構成する必要があります。クライアントのリクエストをすべてインターセプトするためにインターセプターを定義することもできますし、特定のURIマッピングに対して構成することもできます。詳細な例については、Spring MVC Interceptor Exampleをご参照ください。

41. SpringのJdbcTemplateクラスとは何ですか?また、それをどのように使用しますか?

Spring Frameworkは、JDBC APIと非常に優れた統合性を提供し、データベース操作ロジック(接続のオープン/クローズ、ResultSet、PreparedStatementなど)からのボイラープレートコードを回避するために使用できるJdbcTemplateユーティリティクラスを提供しています。

JdbcTemplateの例については、Spring JDBCの例を参照してください。

42. Spring WebアプリケーションでTomcat JNDIデータソースを使用する方法は?

サーブレットコンテナで構成されたJNDIデータソースを使用する場合、スプリングのbean設定ファイルでそれを設定し、それをスプリングの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の例を参照してください。

43. スプリングでのトランザクション管理をどのように実現しますか?

スプリングフレームワークは、宣言的なトランザクション管理およびプログラムによるトランザクション管理を通じてトランザクション管理のサポートを提供しています。宣言的なトランザクション管理は最も広く使われており、使いやすいためほとんどの場合で動作します。

私たちは、デクラレーション型のトランザクション管理のために、@Transactionalアノテーションでメソッドに注釈を付けます。Springビーン構成ファイルでデータソースのトランザクションマネージャを設定する必要があります。

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

44. スプリング DAO とは何ですか?

Spring DAOサポートは、JDBCやHibernateなどのデータアクセス技術との継続的で簡単な連携を提供します。たとえば、JdbcDaoSupport、HibernateDaoSupport、JdoDaoSupport、JpaDaoSupportのような対応する技術用のサポートがあります。

Spring DAOは例外の階層も一貫性を持っており、特定の例外をキャッチする必要はありません。

45. SpringとHibernateフレームワークを統合する方法は? (SpringとHibernateフレームワークの統合のやり方は?)

もしHibernate 3+を使っている場合、Spring ORMモジュールを使用してSpringとHibernateフレームワークを統合することができます。その場合、SessionFactoryが現在のセッションを提供するため、HibernateTemplateやHibernateDaoSupportクラスの使用は避け、依存性注入とDAOパターンを使用することがより良いです。

Spring ORMは、Springの宣言的トランザクション管理を利用するサポートを提供していますので、Hibernateのトランザクション管理のためにボイラープレートコードを使用するよりも、それを活用するべきです。

より理解を深めるためには、以下のチュートリアルを参照することをおすすめします。

  • Spring Hibernate Integration Example
  • Spring MVC Hibernate Integration Example

46. Spring Securityとは何ですか?

Springセキュリティフレームワークは、Javaアプリケーションにおいて認証と認可の両方を提供することに焦点を当てています。また、CSRF攻撃などの一般的なセキュリティ脆弱性にも対応しています。

WebアプリケーションでSpring Securityを使用することは非常に有益で簡単です。@EnableWebSecurityなどのアノテーションを使用することにより、Spring Securityフレームワークの使用方法を学ぶために以下の記事を参照するべきです。

  • Spring Security in Servlet Web Application
  • Spring MVC and Spring Security Integration Example

47. Spring Beanにjava.util.Propertiesを注入する方法はありますか?

指定されたプロパティファイルからプロパティをロードするpropertyConfigurerビーンを定義する必要があります。そして、Spring ELサポートを使用して他のビーンの依存関係にプロパティをインジェクションすることができます。例えば、

<bean id="propertyConfigurer" 
  class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/application.properties" />
</bean> 

<bean class="com.scdev.spring.EmployeeDaoImpl">
    <property name="maxReadResults" value="${results.read.max}"/>
</bean>

もしSpringのビーンを設定するためにアノテーションを使用している場合、以下のようにしてプロパティを注入することができます。

@Value("${maxReadResults}") 
private int maxReadResults;

48. Spring Frameworkで使用されるデザインパターンのいくつかの名前は何ですか?

スプリングフレームワークは、多くのデザインパターンを利用しています。一部のよく使われるものには、次のようなものがあります。

    1. シングルトンパターン:デフォルトスコープでのビーンの作成。

 

    1. ファクトリーパターン:ビーンファクトリークラス。

 

    1. プロトタイプパターン:ビーンのスコープ。

 

    1. アダプターパターン:Spring WebとSpring MVC。

 

    1. プロキシパターン:Springのアスペクト指向プログラミングサポート。

 

    1. テンプレートメソッドパターン:JdbcTemplate、HibernateTemplateなど。

 

    1. フロントコントローラー:Spring MVCのDispatcherServlet。

 

    1. データアクセスオブジェクト:SpringのDAOサポート。

 

    依存性注入とアスペクト指向プログラミング。

Spring Frameworkのベストプラクティスには、どんなものがありますか?

Spring Frameworkのいくつかのベストプラクティスは以下の通りです:

  • Avoid version numbers in schema reference, to make sure we have the latest configs.
  • Divide spring bean configurations based on their concerns such as spring-jdbc.xml, spring-security.xml.
  • For spring beans that are used in multiple contexts in Spring MVC, create them in the root context and initialize with the listener.
  • Configure bean dependencies as much as possible, try to avoid auto wiring as much as possible.
  • For application-level properties, the best approach is to create a property file and read it in the spring bean configuration file.
  • For smaller applications, annotations are useful but for larger applications, annotations can become a pain. If we have all the configuration in XML files, maintaining it will be easier.
  • Use correct annotations for components for understanding the purpose easily. For services use @Service and for DAO beans use @Repository.
  • Spring framework has a lot of modules, use what you need. Remove all the extra dependencies that get usually added when you create projects through Spring Tool Suite templates.
  • If you are using Aspects, make sure to keep the join pint as narrow as possible to avoid advice on unwanted methods. Consider custom annotations that are easier to use and avoid any issues.
  • Use dependency injection when there is an actual benefit, just for the sake of loose-coupling don’t use it because it’s harder to maintain.

50. Spring Bootとは何ですか?

Spring BootはSpringフレームワークを特徴的なものにしています。さまざまなタイプのJavaアプリケーションを簡単に作成し、それらをサーブレットコンテナの実行環境にアタッチできる方法を提供しています。そのため、プロジェクトを実行するために実行可能な単一のJARファイルが得られます。これにより、プロダクトの展開に即したスケルトンプロジェクトを非常に迅速に取得することができます。これにより、コードの構築やサーブレットコンテナへの展開という一般的なプロセスを経る代わりに、ビジネスロジックにより集中することができます。非常に広範なトピックであるため、Spring Bootのインタビューの質問に進むことをお勧めします。

それがSpring Frameworkのインタビューの質問のすべてです。これらの質問がJava EEのインタビューで役立つことを願っています。見つけ次第、リストにさらなる質問を追加します。もしこのリストに含めるべき追加の質問があれば、コメントで教えてください。それを追加します。

コメントを残す 0

Your email address will not be published. Required fields are marked *