SpringAop在实际项目中的使用案例

OP有三种织入切面的方法:

其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;

其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;

其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。

Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。

 

AOP概念到处都在传,之前以为自己了解了,无非就是应用在日志、事务、权限方面的面向切面编程思想的一种架构或者设计模式罢了,今天在迁移一个项目的时候,发现了AOP的妙处。

 

 

实际场景描述,可以说基本每个表结构或者说数据对象都需要createuser,createdate,updateuser,updatedate,创建者,创建时间,修改者,修改时间,如果每次都要自己手动写,在每个dao的add和update方法中复制粘贴,很容易出错,而且工作量比较大的,不能保证完全正确。这个时候我们就可以使用AOP思想,来处理解决该问题。

 

 

Java代码   收藏代码
  1. package com.xxx.util;  
  2.   
  3. import org.aspectj.lang.annotation.Aspect;  
  4. import org.aspectj.lang.annotation.Before;  
  5. import org.slf4j.Logger;  
  6. import org.slf4j.LoggerFactory;  
  7. import org.springframework.stereotype.Repository;  
  8.   
  9. import com.xxx.domain.BaseDomain;  
  10.   
  11. @Aspect  
  12. @Repository("maintainAspect")  
  13. public class MaintainAspect {  
  14.     final static Logger logger = LoggerFactory  
  15.             .getLogger(MaintainAspect .class);  
  16. //扫描路径访问规则,对所有add**的方法进行代理写入  
  17. //所有需要代理写入的方法必须继承BaseDomain,然后强制写入相关用户信息  
  18.     @Before("execution(public * com.xxx.dao.impl.*.add*(..)) &&  args(baseDomain,..)")  
  19.     public void appendCreateInfo(BaseDomain baseDomain) throws Exception {  
  20.         if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {  
  21.             return;  
  22.         }  
  23.         Session session = ThreadVariable.getSession();  
  24.         if (session == null || session.getUserName() == null) {  
  25.             logger.error("系统尝试在无登陆的情况下添加[{}]对象", baseDomain.getClass()  
  26.                     .getName());  
  27.             throw new Exception("Session不存在,系统不能正常工作!");  
  28.         }  
  29.         baseDomain.setCreateDate(session.getAccessTime());  
  30.         baseDomain.setCreateUser(session.getUserName());  
  31.     }  
  32.   
  33.     @Before("execution(public * com.tianque.locationtalk.dao.impl.*.update*(..)) &&  args(baseDomain,..)")  
  34.     public void appendUPdateInfo(BaseDomain baseDomain) throws Exception {  
  35.         if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {  
  36.             return;  
  37.         }  
  38.         Session session = ThreadVariable.getSession();  
  39.         if (session == null || session.getUserName() == null) {  
  40.             logger.error("系统尝试在无登陆的情况下更新[{}]对象,对象ID为[{}]", baseDomain  
  41.                     .getClass().getName(), baseDomain.getId());  
  42.             throw new Exception("Session不存在,系统不能正常工作!");  
  43.         }  
  44.         baseDomain.setUpdateDate(session.getAccessTime());  
  45.         baseDomain.setUpdateUser(session.getUserName());  
  46.     }  
  47.   
  48. }  

 配置环境方面不需要任何更改,也不需要影响之前任何代码,即可实现对相关的数据对象自动添加createuser,createdate,updateuser,updatedate。

 

AOP非常good,这种没有侵害的改造让人非常赏心悦目。很多时候都是人云亦云,以为AOP只能处理事务、日志等东西,实际上AOP远不止的,我们可以让我们的代码变得更加有质量的。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值