博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAop在实际项目中的使用案例
阅读量:6973 次
发布时间:2019-06-27

本文共 2802 字,大约阅读时间需要 9 分钟。

hot3.png

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

其一是编译期织入,这要求使用特殊的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代码  

package com.xxx.util;    import org.aspectj.lang.annotation.Aspect;  import org.aspectj.lang.annotation.Before;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.stereotype.Repository;    import com.xxx.domain.BaseDomain;    @Aspect  @Repository("maintainAspect")  public class MaintainAspect {      final static Logger logger = LoggerFactory              .getLogger(MaintainAspect .class);  //扫描路径访问规则,对所有add**的方法进行代理写入  //所有需要代理写入的方法必须继承BaseDomain,然后强制写入相关用户信息      @Before("execution(public * com.xxx.dao.impl.*.add*(..)) &&  args(baseDomain,..)")      public void appendCreateInfo(BaseDomain baseDomain) throws Exception {          if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {              return;          }          Session session = ThreadVariable.getSession();          if (session == null || session.getUserName() == null) {              logger.error("系统尝试在无登陆的情况下添加[{}]对象", baseDomain.getClass()                      .getName());              throw new Exception("Session不存在,系统不能正常工作!");          }          baseDomain.setCreateDate(session.getAccessTime());          baseDomain.setCreateUser(session.getUserName());      }        @Before("execution(public * com.tianque.locationtalk.dao.impl.*.update*(..)) &&  args(baseDomain,..)")      public void appendUPdateInfo(BaseDomain baseDomain) throws Exception {          if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {              return;          }          Session session = ThreadVariable.getSession();          if (session == null || session.getUserName() == null) {              logger.error("系统尝试在无登陆的情况下更新[{}]对象,对象ID为[{}]", baseDomain                      .getClass().getName(), baseDomain.getId());              throw new Exception("Session不存在,系统不能正常工作!");          }          baseDomain.setUpdateDate(session.getAccessTime());          baseDomain.setUpdateUser(session.getUserName());      }    }

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

 

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

转载于:https://my.oschina.net/zrz1992/blog/1814610

你可能感兴趣的文章
求整数数组中最大子数组的和
查看>>
hdu2546-饭卡???
查看>>
Silverlight 获取控件间的相对位置
查看>>
vscode icon in elementary os
查看>>
Android环境搭建(Windows)
查看>>
MSHFLEXGRID控件常用属性
查看>>
去除iframe滚动条
查看>>
在WORD表格按列添加时间的一种方法
查看>>
poj 2455 Secret Milking Machine
查看>>
Linux 中,如何显示 (gcc)make时实际执行命令
查看>>
每个程序员都应该了解的内存知识(2)-CPU caches
查看>>
solr error logs org.apache.solr.common.SolrException: ERROR: [doc=17] unknown field alias
查看>>
django 项目创建使用
查看>>
简单的Verilog测试模板结构
查看>>
接口数据加密
查看>>
vue-router-transiton
查看>>
Micresoft Dynamices CRM 中的Webresouce
查看>>
DevExpress之TreeList节点绑定图片
查看>>
OC分类(Category)
查看>>
【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!...
查看>>