如果您使用的是 Tomcat,可以,但这需要一些工作。
解决方案是包装普通的 tomcat 实例管理器(它用于实例化 JSP 实例),然后通过侦听器注入包装后的版本。
首先,包装管理器类。它非常简单,只需在返回新创建的对象之前将 bean 注入它们。
public class SpringInstanceManager implements InstanceManager {
ServletContext ctx;
InstanceManager manager;
public SpringInstanceManager(ServletContext ctx, InstanceManager manager){
this.ctx = ctx;
this.manager = manager;
}
public Object processAnnotations(Object o) throws IllegalAccessException, InvocationTargetException, NamingException {
if (o != null && o.getClass().getName().endsWith("_jsp")){
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(o, ctx);
}
return o;
}
@Override
public Object newInstance(Class<?> clazz) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException {
return processAnnotations(manager.newInstance(clazz));
}
@Override
public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
return processAnnotations(manager.newInstance(className));
}
@Override
public Object newInstance(String fqcn, ClassLoader classLoader) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
return processAnnotations(manager.newInstance(fqcn, classLoader));
}
@Override
public void newInstance(Object o) throws IllegalAccessException, InvocationTargetException, NamingException {
manager.newInstance(o);
}
@Override
public void destroyInstance(Object o) throws IllegalAccessException, InvocationTargetException {
manager.destroyInstance(o);
}
}
然后我们添加一个监听器在上下文启动时注入它:
public class SpringJSPEnablerListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
InstanceManager oldManager = ((InstanceManager) (context.getAttribute(InstanceManager.class.getName())));
if (!(oldManager instanceof SpringInstanceManager)) {
InstanceManager springInjectingInstanceManager = new SpringInstanceManager(context,oldManager);
context.setAttribute(InstanceManager.class.getName(), springInjectingInstanceManager);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
然后在 JSP 页面中你可以使用类似这样的东西
<%! @Autowired MyClass myClassInstance %>
它应该可以正常工作。