Spring 2-Layered


💪 中に入ると….
Springでは2層のアーキテクチャがよく使われています.
2層アーキテクチャは、単純に、表示層からなるMVCと、業務機能を実行する業務層からなる構造である.
前述の論文では,DAOクラスを直接使用するのではなく,ビジネスコンポーネントを用いて機能を実装しなければならない理由について議論した.
この記事では、このプロセスの問題をどのように解決するかについて説明します.
😫 階層2で発生する可能性のある問題
この構造を実装する際の最も一般的な問題は、@AutowiredのNoSuchBeanDefinitionExceptionである可能性があります.
上記の問題は、オブジェクトに依存性を注入しようとすると、オブジェクトには関連するタイプのメモリがないため、依存性を注入できないことを示しています.
これは、DispatcherServicelet関連オブジェクトを生成するスプリング設定ファイルが@Autowiredで使用するオブジェクトを生成するスプリング設定ファイルよりも先に読み込まれるためです.
@Autowiredを使用してオブジェクトを検索しようとしましたが、まだ作成されていないため、問題が発生しました.
(Springは一番作りにくいようです.ううう)
🤦‍♀️ 解決策
この問題を解決するには、@Autowiredで使用するオブジェクトを最初に作成する必要があります.つまり、Spring設定ファイルの呼び出し順序を変更することができます.
まず、ContextLoaderListenerを呼び出すには、ContextLoaderListenerを同じ場所に登録する必要があります.
クライアントのリクエストがない場合は、コンテナが移動されたときにプリロードオブジェクトと見なすことができます.
既存のWeb.xmlでは、クラスを登録するために以下のコードを作成できます.
<listener>
	<listener-class>
    	org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
ただし、コードの作成と変換のみを行うと、次の理由でFileNotFoundExceptionの問題が発生します.
なぜなら、ContextLoaderListenerのデフォルトは/WEB-INF/APplicationContextです.xmlファイルを読み込むと、設定ファイルがその場所にありません.
したがって、既存の場所のApplicationContext.xmlを適切な場所にコピーして貼り付けることができますが、問題は2つの同じファイルのメンテナンスが困難になることです.
したがって,レプリケーションによる問題解決に比べて,次のコードはwebである.xmlに追加すると、問題は解決します.
<context-param>
	<param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
これで、コンテキストLoader Listerオブジェクトを作成し、まずApplicationContextを呼び出して関連オブジェクトを作成することで、階層2のアーキテクチャをよりよく実装できます.