フィルタにspringのbeanを注入する
2404 ワード
プロジェクトの問題を記録します.
1 web.xmlの各要素の起動順序は、プロジェクトの起動時にリスナーlistenerが最初に初期化され、フィルタfilter、最後にservletになります.Spring Listenerは起動時にspringプロファイルを読み込み、springコンテナの初期化を行います.SpringMVCのdispatcherServicelet初期化時にspringMVCのプロファイルを読み込み、springMVCコンテナの初期化を行います.Springコンテナは初期化時に各beanがインスタンス化されます.(個人的にはwebコンテナの初期化時にその中の各要素は上記の順序で順次初期化されていると考えられ、他の要素はすべて初期化が完了してからwebコンテナの初期化が完了したと考えられているが、現在は十分な説は見られず、後でソースコードを検討する時間がある).2フィルタの使用ネット上の多くの資料はフィルタの中でspring注入のbeanが得られないと言って、フィルタの初期化の時spring容器はまだ初期化していないので、個人的には間違っていると思って、sping容器はfilterの初期化より先に完成するべきです.次はコードを見ます:web.xmlでフィルタを定義するには:
次に、フィルタの初期化方法initで:
テストの結果、springのredisTemplateというbeanを手に入れることができ、spring容器がフィルタより先に初期化されていることを示します.では、フィルタに戻ってbeanを注入できない問題は、いったい何が原因なのでしょうか.ここで取得beanは、直接注入するのではなくアプリケーションContextによって取得されることがわかる.フィルタはservlet仕様で定義されており、springコンテナ管理ではなく、springのbeanに直接注入することもできません(エラーが発生します).もちろん、spring注入でフィルタを使うには方法があるので、まずweb.xmlで定義:
次にspringコンテナでdemoFilterというbeanを構成します.
注入されたbeanはdoFilterメソッドで取得できます.
1 web.xmlの各要素の起動順序は、プロジェクトの起動時にリスナーlistenerが最初に初期化され、フィルタfilter、最後にservletになります.Spring Listenerは起動時にspringプロファイルを読み込み、springコンテナの初期化を行います.SpringMVCのdispatcherServicelet初期化時にspringMVCのプロファイルを読み込み、springMVCコンテナの初期化を行います.Springコンテナは初期化時に各beanがインスタンス化されます.(個人的にはwebコンテナの初期化時にその中の各要素は上記の順序で順次初期化されていると考えられ、他の要素はすべて初期化が完了してからwebコンテナの初期化が完了したと考えられているが、現在は十分な説は見られず、後でソースコードを検討する時間がある).2フィルタの使用ネット上の多くの資料はフィルタの中でspring注入のbeanが得られないと言って、フィルタの初期化の時spring容器はまだ初期化していないので、個人的には間違っていると思って、sping容器はfilterの初期化より先に完成するべきです.次はコードを見ます:web.xmlでフィルタを定義するには:
demoFilter xx.framework.filter.demoFilter
demoFilter
/*
次に、フィルタの初期化方法initで:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
RedisTemplate demoBean = (RedisTemplate)context.getBean("redisTemplate");
System.out.println(demoBean);
}
テストの結果、springのredisTemplateというbeanを手に入れることができ、spring容器がフィルタより先に初期化されていることを示します.では、フィルタに戻ってbeanを注入できない問題は、いったい何が原因なのでしょうか.ここで取得beanは、直接注入するのではなくアプリケーションContextによって取得されることがわかる.フィルタはservlet仕様で定義されており、springコンテナ管理ではなく、springのbeanに直接注入することもできません(エラーが発生します).もちろん、spring注入でフィルタを使うには方法があるので、まずweb.xmlで定義:
DelegatingFilterProxy org.springframework.web.filter.DelegatingFilterProxy
targetBeanName
demoFilter
targetFilterLifecycle
true
DelegatingFilterProxy
/*
次にspringコンテナでdemoFilterというbeanを構成します.
注入されたbeanはdoFilterメソッドで取得できます.
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
System.out.println(redisTemplate.getClientList());
}