怎样用spring aop 拦截servlet

附件中的小例子可以用spring aop拦截普通类的方法,但是不能拦截servlet,可能是因为servlet是由web容器实例化而不是有spring容器实例化。请问怎样可以实现spring aop拦截servlet?或者怎样用spring实例化servlet?谢谢!

这里的理解显然是没有弄清servlet开发中的一些理解
[quote]
这样确实可以解决,应该还要更好的方案吧,spring可以实例化struts2的antion,肯定是可以实例化servlet的

还是感谢mginobili[/quote]

struct的action、spring mvc等是通过自定义Servlet实现的,如struct的ActionServlet,spring mvc的DispatcherServlet。
他们都是在servlet规范之上构建的。

spring如何在servlet中启动,是通过配置listener启动spring容器。spring容器再去管理spring的bean.

spring为何能管理action,因为action是简历在spring容器之中。

以上三点可以看到。无论是action,还是spring bean,都是在servlet规范之上整合的。

servlet的由servlet容器管理,tomcat,jetty等,如果你想通过spring实例化servlet,那么就需要在spring中操作tomcat,jetty实例化servlet的代码。

是否可行没有操作过。

不过我们可以看到,spring自己的启动(listener启动)、spring mvc都是通过servlet转到spring之上的bean处理。

不过你的想法可以换一下,servlet转发到spring bean,通过aop处理。网络上很多spring gwt整合的例子。见:
http://jiangyongyuan.iteye.com/blog/143455

可以使用适配器模式

在servlet中定义一个对象obj(对象的类中有servlet同名的所有方法)

servlet的所有后台操作 改为调用这个对象 进行
比如servlet.doPost()方法
中就调用obj.doPost()

然后就可以再spring的配置中 对这个obj进行AOP拦截了

很不明白你为什么要为servlet做AOP,如果是需要对所有web请求进行拦截直接写个Filter配置到web.xml里面不就行了?还有一个问题,spring是不能实例化action的,action对象是struts生成的,你需要对struts.xml进行配置来让spring进行托管

呵呵,可以看看Spring提供的httpinvoker,这里就是用到的Servlet

可以考虑在 你的servlet中调用一个ActionBean,而该Bean是对Spring容器管理的,那么就很容易使用Spring的AOP特性完成你的要求了。

其实,如果你使用springMVC 作为你的Web框架,那么最终的servlet就是一个ActionBean。

如你所提到的 Spring可以实例化struts2的antion 那是因为struts2为集成spring做了相应的接口(因为Spring实在是太流行了),很多Web框架其实都有提供与Spring的集成接口。

你是用的是GWT吗?,我不知道GWT是否有提供针对Spring的集成接口,我想官方可能不会提供吧,因为google有自己的guice,但我想在民间,一定有人为GWT集成Spring做过努力了,你尝试搜索 Spring + GWT 试试看,....

如果真的还没有成熟的扩展用于 GWT集成Spring,那就自己写一个吧,其实并不难,就是在你的servlet中 用某中策略 去选择 Spring容易总的一个Bean,再将客户请求委托给Bean处理即可.

我觉得你的要求是不可实现的。
spring的aop是如何实现的?是因为你将对象交给它托管了,它才能对它托管的对象实例化和方法调用的时候进行拦截。如果一个对象的实例化和方法调用不是通过它,它怎么能控制住呢?

servlet是由web容器实例化和调用的,spring控制不了他们。最多只是用过滤器做一些处理

servlet 和 aop直接 adapter

一:代码级
二:运行期--cglib之流