Cómo utilizar el autowire de Spring para inyectar beans en servlets
Para los filtros, Spring proporciona DelegatingFilterProxy, por lo que este artículo se centrará en la solución Servlet.
1. Un método más intuitivo pero menos elegante es anular el método init(), que utiliza AutowireCapableBeanFactory para decirle manualmente a Spring: necesito que este Servlet sea un Bean. El método de escritura específico es:
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);
Donde BEAN_NAME es el nombre del Bean que debe inyectarse y registrarse en Spring.
El principal problema al escribirlo de esta manera es BEAN_NAME, es un poco como una búsqueda activa, no una inyección de dependencia.
2. Cree un proxy similar a DelegatingFilterProxy y utilícelo para encontrar el servlet real de acuerdo con la configuración para completar la función de lógica empresarial.
Supongamos que tenemos un Servlet llamado UserServlet, necesitamos inyectar un UserManager, el pseudocódigo es el siguiente:
public class UserServlet extends HttpServlet {
@ Autowired (requerido = verdadero)
UserManager privado userManager;
}
Paso uno:
la clase pública DelegatingServletProxy extiende GenericServlet { p >
targetBean de cadena privada;
proxy de servlet privado
@Override
servicio público nulo (ServletRequest req, ServletResponse res) lanza ServletException, IOException {
proxy.service(req, res
}
@Override
public void init() lanza ServletException {< / p>
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig()); / p>
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils.getBean(targetBean
}
}
<); p > Paso 2:Configurar el archivo web.xml, que es más o menos lo mismo que UserServlet:
lt;servletgt;
lt;servlet-namegt ;userServletlt ;/servlet-namegt;
lt;servlet-classgt;com.sample.UserServletlt;/servlet-namegt;
lt;servlet-classgt;com.sample.UserServletlt ;/ nombre-servlet;