springのautowireを使用してservletにbeanを注入する方法

3596 ワード

アプリケーションでは一般的なJavaPojoはSpringで管理されているのでautowire注釈を使って注入しても問題はありませんが、例外は2つあります.1つはFilter、1つはサーブレットです.この2つはサーブレットコンテナで管理されているので、他のBeanと同じようにAutowireで注入したい場合は、余分な工夫が必要です.
FilterについてSpringはDelegatingFilterProxyを提供しているので,本稿では主にサーブレットの解決について述べる.
1、比較的に直観的だがあまり優雅ではないやり方はinit()の方法を書き換えることで、中でAutowireCapableBeanFactoryを使ってSpringに手作業で教えます:私のこのサーブレットはこのようなBeanが必要です.具体的な書き方:
	public void init(ServletConfig servletConfig) throws ServletException {
		ServletContext servletContext = servletConfig.getServletContext();
		WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
		AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext.getAutowireCapableBeanFactory();
		autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
	}

そのうち、BEAN_NAMEは注入するBeanがspringに登録する名前です.
このように書いた主な問題はそのBEANです.NAME、このように書くのは少し自発的に探して、注入の感じに依存するのではありません.
2、DelegatingFilterProxyのようなエージェントを作成し、エージェントが構成に基づいて実際のサーブレットを見つけ、ビジネスロジック機能を完成する.
次のように疑似コードを入力する必要があります.
public class UserServlet extends HttpServlet {
@Autowired(required = true)
private UserManager userManager;
}

ステップ1:
public class DelegatingServletProxy extends GenericServlet {
private String targetBean;
private Servlet proxy;

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
proxy.service(req, res);
}

@Override
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}

private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}

ステップ2:
Web.xmlファイルを構成するには、元のUserServiceletの構成は大体次のようになります.
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.sample.UserServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>

次のように変更します.
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.sample.DelegatingServletProxy</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>

または、
<servlet-name>menueInitServlet</servlet-name>
<servlet-class>cc.jqkj.oa.servlet.DelegatingServletProxy</servlet-class>
<init-param>
<param-name>menue-init-file</param-name>
<param-value>WEB-INF/menue.properties</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

注意、springはサーブレットの名前に基づいてエージェントのサーブレットを検索するので、まずUserサーブレットクラスの前に@Componentを付けて、Srping:私もBeanです.名前がWeb.xmlで定義されているものと異なる場合は、ここでBeanの名前を指定できます.たとえば、@Component("userService")springプロファイル: