快速业务通道

Spring 2.5访问Session属性的四种策略 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
明一类 interface,比如 IUserAware。这样开发人员就可以只针对这些需要注入 User 对象的 controller 进行注入增强。

IUserAware 的代码:

public interface IUserAware { public void setUser(); }

controller 的代码:

@Controller public GreetingController implements IUserAware { private User user; public void setUser(User user){  this.user = user; } @RequestMapping public void hello(){  //user.sayHello(); } // }

Interceptor 的代码:

public class UserInjectInterceptor extends HandlerInterceptorAdapter { @Override   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {     if (handler.isAssignableFrom(IUserAware)){      User user = (User)httpServletRequest.getSession().getAttribute("currentUser");      IUserAware userAware = (IUserAware) handler;      userAware.setUser(user);     }     return super.preHandle(httpServletRequest, httpServletResponse, handler);   }   // }

为了让 SpringMVC 能调用我们定义的 Interceptor,我们还需要在 SpringMVC 配置文件中声明该 Interceptor,比如:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">   <property name="interceptors">     <list>       <ref bean="userInjectInterceptor"/><!-- userInjectInterceptor bean 的声明省略-->     </list>   </property> </bean>

Spring 2.5访问Session属性的四种策略(3)

时间:2011-09-07

优点:

1. 对 Servlet API 的访问被移到了自 SpringMVC API 扩展的 Interceptor,controller 不需要关心 User 如何得到。

2. 开发人员可以通过随时添加或移除 Interceptor 来完成对不同参数在某一类型 controller 上的注入。

3. controller 的 User 对象通过外界注入,测试时开发人员可以很容易地注入自己想要的 User 对象。

4. controller 类去掉了对 Servlet API 的依赖,更 POJO 和通用。

5. controller 类是通过对 interface 的声明来辅助完成注入的,并不存在任何继承依赖。

不足:

1. SpringMVC 对 controller 默认是按照单例(singleton)处理的,在 controller 类中添加一个成员变量,可能会引起多线程的安全问题。

2. 因为 User 对象是定义为 controller 的成员变量,而且是通过 setter 注入进来,在测试时需要很小心地保证对controller 注入了 User 对象,否则有可能我们拿到的就不一定是一个“好公民”(Good Citizen)。

其实,一言而蔽之,这些不足之所以出现,是因为我们把某个 action 级别需要的 User 对象上提到 controller 级别,破坏了 the convention of stateless for controller classes,而 setter 方式的注入又带来了一些隐含的繁琐和不足。当然,我们可以通过把 controller 声明为“prototype”来绕过 stateless 的约定,也可以保证每次 new 一个 controller 的同时给其注入一个 User 对象。但是我们有没有更简单更 OO 的方式来实现呢?答案是有的。

(三)通过方法参数处理类(MethodArgumentResolver)在方法级别注入User对象

正如前面所看到的,SpringMVC 提供了不少扩展点给开发人员扩展,让开发人员可以按需索取,plugin 上自定义的类或 handler。那么,在 controller 类的层次上,SpringMVC 提供了 Interceptor 扩展,在 action 上

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号