随笔-67  评论-522  文章-0  trackbacks-0
    通过之前一篇基于SSH2框架Struts2拦截器的登录验证实现的文章,我们简单的运用了拦截器来实现功能,这次大象将在前面的基础上再进行一次扩展,运用AspectJ AOP切面实现登录登出日志的功能。
    AOP切面是一个非常不错的特性,为我们带来了一种新的编程方式,对代码的无侵入性是它最大的特点。像上篇我们用到的Struts2拦截器就是AOP的一个典型运用。从Spring的低版本开始就能够实现切面功能,但是非常麻烦,不过当Spring升级到2.0之后,这一情况就彻底改变了。运用JDK 5.0支持的注解特性,大大方便了我们的开发。在本篇中,大象将以AspectJ注解方式实现AOP的切面功能。
    在这里我还是假设一下,你已经对Spring AOP有一个基本了解,至少知道AOP的基本概念,比如:切入点,通知,切入表达式,横切逻辑等等内容。那么只需要在之前的基础上做下小小的改变,就可以使用AspectJ实现日志的登录登出功能。
    增加日志表
    记录日志信息当然需要日志表了,我们在数据库中增加一个log表。
    
    增加实体类
    增加Log实体类,字段名与属性名一致,这样就可以不用加Column注解了。另外没有其它的关联关系,这个类很干净,是一个纯POJO类。具体请看源码,这里就不贴出来了。
    增加切面类
    这就是本篇的关键所在了,定义切面类。common包下面再增加一个aop包,创建LogAspect类。
    
    在LogAspect类之上标明@Aspect注解,指定此类为一个切面类。这样的实现方式是不是很简单?然后定义切入点与通知类型以及切入实现(一般叫做横切增强,其实就是切入之后想实现的功能)。这里我实现了两个切入方法,一个是登录,当执行完登录操作,还没有转向到结果页面时执行;另一个是登出,在执行登出之前调用横切逻辑。最后一个是共用的保存日志方法,这里只是简单的说明日志记录如何实现,可以对日志表进行扩充,比如增加用户IDIP地址、模块ID等等信息。
    @Before@After都是通知类型,前者是在连接点之前执行,后者则是在连接点之后执行。
    修改struts.xml
    增加一行配置<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />作用是确保Spring的自动装配策略总是被考虑。默认为false,如果不将它改为true,则在使用CGLib代理Action类后,使用@Autowired注入的service类将会为null,那么这些目标方法中与数据库交互的逻辑都不能执行,所以一定要将它改为true
    修改applicationContext.xml
    添加<aop:aspectj-autoproxy proxy-target-class="true" />声明,为Spring容器中那些匹配@AspectJ切面的Bean创建代理,其中的proxy-target-class="true" 表示使用CGLib动态代理技术织入增强,不过只声明还不行,还得织入,把编写好的切面类完整路径添加到配置文件中,这样才能发挥切面的功能。
    到这里,所有工作都已经完成,启动服务器,来试一下,看看登入登出后,log表中是否会有记录?呵呵,当然会有了,要是没有大象也不敢写出来找骂了。通过这个实例,我们可以看到,运用AOP的思想可以进行无侵入式的开发,这符合当前非常强调的松耦合性,对以后的维护来讲也相对会简单一些。
    源码下载: ssh2-aop
    本文为菠萝大象原创,如要转载请注明出处。 http://bolo.blogjava.net/
posted on 2011-05-13 23:07 菠萝大象 阅读(5952) 评论(2)  编辑  收藏 所属分类: Struts2

评论:
# re: 基于SSH2框架AspectJ的登录登出日志实现 2011-05-13 23:22 | 菠萝大象
去年9月就已经写好,一直没有发出来,被一些乱七八糟的事情耽误了,接下来,大象会连续放出Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解系列文章,Struts2已经离我们远去,Spring MVC 3.0已经开始进入我们的视野,它的REST开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,现在已经被很多公司作为新的系统开发框架,大象将结合刚刚完成的项目和之前的SSH2框架,整出一个便于理解的SSM框架出来,提供给大家学习,希望写的不对的或有更好建议的朋友多提宝贵意见。  回复  更多评论
  
# re: 基于SSH2框架AspectJ的登录登出日志实现 2011-05-18 14:31 | 菠萝大象
这里有个bug大象说下,就是log表中,logtime的数据类型为timestamp,这样定义不是很好,应该改为datetime,因为timestamp的时间段有限,只能表示1970-2038年,作为一个日期类型这样是不好的,大象会修改一下,更新下博客和源码  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: