私は Web 環境で Spring Framework 4.3.3 を使用しています。
私は2つのコンテキストを持っています:
RootApplicationContext
ServletApplicationContext
ServletApplicationContext
たとえば、Web 側に関するすべての Bean が含まれていることはわかっています@Controller
。さらに、たとえばなどServletApplicationContext
からすべてのコンテキストまたは Bean にアクセスできます。ここまでは問題ありません。RootApplicationContext
@Service, @Repository
@Configuration
クラスにも適用されることに注意してください。(インフラストラクチャー)
したがって、前の紹介では、次のように考えることができます。
ServletApplicationContext
-->RootApplicationContext
考慮すべき重要なことは、逆は不可能だということです。
したがって
RootApplicationContext
-->ServletApplicationContext
できません。センスがあってOKです。サーバー側は Web 側にアクセスすべきではありません
AspectJについて。私は次のものを持っています:
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
}
ここで 1 つの重要なポイント:
- これ
AopConfig
はによってスキャンされますRootApplicationContext
- のアクセスを通じてそれ
ServletApplicationContext
を参照できると信じています@Configuration
RootApplicationContext
- のアクセスを通じてそれ
わかりました、@Test
メソッドを実行すると。
私が使用するサーバー側から Test クラスを実行するとき
@ContextConfiguration(classes={RootApplicationContext.class} )
- それだけ
RootApplicationContext
- それだけ
そして、AOPは正常に動作します。AOP + logging
次のプロセスで確認できます。
@Service
->@Repository
Web 側から Test クラスを実行するときは、次を使用します。
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})
RootApplicationContext
とServletApplicationContext
そして、AOPは正常に動作します。AOP + logging
次のプロセスで 確認できます。
@Controller
->@Service
->@Repository
今、生産のために私は持っています:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootApplicationContext.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{ServletApplicationContext.class};
}
しかし、プロジェクトを.war
ファイルにエクスポートし、URL/URI を介してController
実行すると、期待される動作またはプロセスが正常に動作します。しかし、AOP についてAOP + logging
は、次のプロセスが発生します。
@Service
->@Repository
@Controller
出力には表示されません。予想されるフロー プロセスは次のようになります。
@Controller
->@Service
->@Repository
では、なぜ本番環境ではなく、テスト環境で機能するのでしょうか?
私はすでに調査を行っており、次の2つの投稿を見つけました。
実際には、@Configuration
クラスは@EnableAspectJAutoProxy
スキャンする必要があり、スキャンする必要はないと言ってServletApplicationContext
いますRootApplicationContext
それが正しい場合でも (新しい実験によると)、サーバー側は Web 環境なしでテストする必要があると考えてください。
その他のインフラストラクチャについては、すでに説明した関係@Bean
を通じて、作品についてどのように期待されますか。AOPだけでこの状況があります。@Configuration
ServletApplicationContext --> RootApplicationContext
質問 01 : では、なぜこのような振る舞いをするのでしょうか?
質問 02AopConfig
:スキャンを維持し、RootApplicationContext
本番環境で期待される動作を取得するにはどうすればよいですか?
AopConfig
によってスキャンされたかどうかに注意ServletApplicationContext
してください。テストに関する次のことは、サーバー側で有効かつ必須@ContextConfiguration(classes={RootApplicationContext.class, AopConfig.class} )
です。の追加を参照しAopConfig.class
てAopConfig
くださいRootApplicationContext
。