- ある
applicationContext.xml
とspring-servlet.xml
春Frameworkでとにかく関連? - で宣言されたプロパティファイルは
applicationContext.xml
利用できますDispatcherServlet
か? - 関連するメモで、なぜ私
*-servlet.xml
はまったく必要なのですか?なぜapplicationContext.xml
一人では不十分ですか?
applicationContext.xml
とspring-servlet.xml
春Frameworkでとにかく関連?applicationContext.xml
利用できますDispatcherServlet
か?*-servlet.xml
はまったく必要なのですか?なぜapplicationContext.xml
一人では不十分ですか?回答:
Springでは、親子階層で複数のコンテキストを定義できます。
applicationContext.xml
つまり、Webアプリケーションに関連付けられているコンテキスト、「ルートWebアプリケーションのコンテキスト」のための豆を定義します。
spring-servlet.xml
(または任意の他、あなたがそれを呼び出す)1つのサーブレットのアプリケーションコンテキストの豆を定義します。これらの多くは、Springサーブレットごとに1つ(例:spring1-servlet.xml
サーブレットspring1
、spring2-servlet.xml
サーブレットspring2
)のWebアプリケーションに存在できます。
のBeanはのBeanをspring-servlet.xml
参照できますapplicationContext.xml
が、その逆はできません。
すべてのSpring MVCコントローラーはspring-servlet.xml
コンテキスト内で実行する必要があります。
ほとんどの単純なケースでは、applicationContext.xml
コンテキストは不要です。通常は、Webアプリケーションのすべてのサーブレット間で共有されるBeanを含めるために使用されます。サーブレットが1つしかない場合は、特別な用途がない限り、あまり意味がありません。
クライアントアプリケーション内(アプリケーションはWebアプリケーションではない。たとえば、swingアプリである可能性がある)
private static ApplicationContext context = new ClassPathXmlApplicationContext("test-client.xml");
context.getBean(name);
web.xmlは必要ありません。Beanサービスを取得するためのコンテナとしてのApplicationContext。Webサーバーコンテナーは必要ありません。でテストclient.xmlのないリモートシンプルな豆、リモーティングと豆が存在し得ます。
結論:シナリオ1では、applicationContextとDispatcherServlet
関連していません。
サーバーアプリケーション(Tomcatなどのサーバーにデプロイされたアプリケーション)。クライアントプログラム(例:Swingアプリ)からのリモート処理を介したサービスへのアクセス
web.xmlでリスナーを定義する
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
サーバーの起動時にContextLoaderListener
、applicationContext.xmlで定義されたBeanをインスタンス化します。
applicationContext.xmlで以下を定義したと仮定します。
<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />
Beanは、4つの構成ファイルtest1.xml、test2.xml、test3.xml、test4.xmlからインスタンス化されます。
結論:シナリオ2では、applicationContextとDispatcherServlet
関連していません。
Spring MVCを使用するWebアプリケーション。
ではweb.xmlの定義:
<servlet>
<servlet-name>springweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springweb</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
Tomcatが起動すると、springweb-servlet.xmlで定義されたBean がインスタンス化されます。
DispatcherServlet
伸びFrameworkServlet
ます。でFrameworkServlet
豆のインスタンスspringwebのために行われます。私たちの場合、springwebはFrameworkServletです。
結論:シナリオ3では、applicationContextとDispatcherServlet
関連していません。
Spring MVCを使用するWebアプリケーション。サーブレットの場合はspringweb-servlet.xml、サーバープログラム内のビジネスサービスにアクセスする場合、または別のサーバープログラムのDBサービスにアクセスする場合はapplicationContext.xml。
web.xml以下が定義されています。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springweb</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
サーバーの起動時に、applicationContext.xmlでContextLoaderListener
定義されたBeanをインスタンス化します。ここで宣言したと仮定します:
<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />
Beanはすべて、4つのtest1.xml、test2.xml、test3.xml、test4.xmlからインスタンス化されます。applicationContext.xmlで定義されたBeanのインスタンス化が完了すると、springweb-servlet.xmlで定義されたBeanがインスタンス化されます。
したがって、インスタンス化の順序は、ルート(アプリケーションコンテキスト)、次にFrameworkServletです。
これで、どのシナリオでそれらが重要なのかが明確になります。
DispatcherServlet
URLが.actionで終わっていない場合、springweb は呼び出されませんか?
もう一点付け加えたい。ではspring-servlet.xml
、私たちは、コントローラパッケージの構成要素のスキャンが含まれています。次の例では、コントローラーパッケージのフィルター注釈を含めます。
<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="org.test.web" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
ではapplicationcontext.xml
、私たちコントローラを除くパッケージを、残りのフィルタを追加します。
<context:component-scan base-package="org.test">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
@Controller
サーブレットコンテキストでBean をスキャンする必要があります(Spring MVCで必要)。
簡単に言えば、
applicationContext.xml
すべてのサーブレット間で共有されるBeanを定義します。アプリケーションに複数のサーブレットがある場合は、で共通リソースを定義applicationContext.xml
する方が理にかなっています。
spring-servlet.xml
そのサーブレットにのみ関連するBeanを定義します。これはディスパッチャーサーブレットです。したがって、Spring MVCコントローラーをこのファイルで定義する必要があります。
spring-servlet.xml
Webアプリケーションでサーブレットを1つだけ実行している場合でも、すべてのBeanを定義しても問題はありません。
サーブレット技術では、特定のサーブレットに入力を渡したい場合は、以下のコードのようにinit paramを渡す必要があります。
<servlet>
<servlet-name>DBController</servlet-name>
<servlet-class>com.test.controller.DBController</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>John</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DBController</servlet-name>
<url-pattern>/DBController</url-pattern>
</servlet-mapping>
すべてのサーブレットに共通するいくつかの入力を渡したい場合は、そのときにコンテキストパラメータを設定する必要があります。例
<context-param>
<param-name>email</param-name>
<param-value>admin@example.com</param-value>
</context-param>
Spring MVCで作業しているときは、これとまったく同じように、init paramを介して、DispatcherServletである、Springによって提供される事前定義サーブレットに情報を提供する必要があります。したがって、構成は休閑地です。ここでは、DispatcherServletのinitパラメータとしてspring-servlet.xmlを提供しています。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Spring MVC App</display-name>
<servlet>
<servlet-name>SpringController</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringController</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
ここでも、いくつかのコンテキストパラメータが必要です。これはアプリケーション全体に当てはまります。したがって、applicationcontext.xmlであるルートコンテキストを提供できます。構成は次のようになります。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>SpringController</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringController</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
アプリケーションコンテキストは、これらのメッセージの国際化のサポートを含む、テキストメッセージを解決する手段を提供します。アプリケーションコンテキストは、画像などのファイルリソースをロードする一般的な方法を提供します。アプリケーションコンテキストは、リスナーとして登録されているBeanにイベントを発行できます。Beanファクトリーを使用してプログラムで処理する必要があるコンテナーまたはコンテナー内のBeanに対する特定の操作は、アプリケーションコンテキストで宣言的に処理できます。ResourceLoaderのサポート:SpringのResourceインターフェースは、低レベルのリソースを処理するための柔軟で汎用的な抽象化を使用します。アプリケーションコンテキスト自体はResourceLoaderであるため、アプリケーションにデプロイメント固有のResourceインスタンスへのアクセスを提供します。MessageSourceサポート:アプリケーションコンテキストは、ローカライズされたメッセージを取得するために使用されるインターフェイスであるMessageSourceを実装します。