spring-aop日志处理.docx_第1页
spring-aop日志处理.docx_第2页
spring-aop日志处理.docx_第3页
spring-aop日志处理.docx_第4页
spring-aop日志处理.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于注解的spring-aop日志处理编写一个简易demo:1, 在maven的pom.xml文件中添加所需jar包 org.springframework spring-context 3.0.5.RELEASE org.aspectj aspectjweaver 1.6.11 junit junit 4.8.2 test 2, 创建如下一个日志处理类 /* * 日志记录处理类 * author dell * */AspectComponentpublic class LogerAspect /起一个标记作用Pointcut(execution (* com.manager.*.service.*.*(.)public void logAspect()/logAspect() 引用上面的标记Before(value = logAspect()public synchronized void beforeOperateLog(JoinPoint jp)/这里可以做些调用之前的控制操作,比如说权限控制,拦截等System.out.println(“before run.”);After(logAspect()public synchronized void addOperateLog(JoinPoint jp)/这里可以做一些调用之后的处理,如记录日志到数据库System.out.println(“after run.”);3, 创建一个TeseService接口,以及接口的实现类TestServiceImplpublic interface TestService public void test();public class TestServiceImpl implement TestServicepublic void test()System.out.println(“service run.”);4, 在application-context.xml 配置文件中添加如下配置5, 创建一个junit单元测试public class TestModel ClassPathXmlApplicationContext context;TestService service;Beforepublic void before()context= new ClassPathXmlApplicationContext(application-context.xml);service =(TestService)context.getBean(testService);Testpublic void test()service.test();6, 测试运行结果显示:模拟一个简单的增删改查的日志记录过程1. 首先创建一个描述注解,用与对字段进行描述,后期用得到/* * 注解字段 * author dell * */Target(ElementType.FIELD) /表示该注解只能用于字段Retention (RetentionPolicy.RUNTIME) Documentedpublic interface DescAnnotation /描叙String description();2. 创建一个操作日志注解(这个写的很好,不是我写的)/* * * author dell * */Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)Documentpublic interface OperateLoger /* * 描叙信息 * return */String content() default 无描述信息;/* * C:增加 R:查询 U:修改 D:删除 * author dell * */enum OperationType C, R, U, D , LOGIN_IN,LOGIN_OUT;OperationType operationType() default OperationType.R;/* * U时必须传入原始对象(修改时要有用到,action中必须有getOldBean()方法,也就是先的查询出修改前的对象) * return */String oldObject() default OldBean;/* * C,U时候用到,目标对象 必须传入值(增加,删除,查询时用到,页面传过来的对象,action中必须有getBean()方法) * return */String targetObject() default Bean;/* * OUT:通知外部系统,IN:通知本系统,ALL:同时通知 * author dell * */enum NoticeSystem OUT, IN, ALL;NoticeSystem noticeSystem() default NoticeSystem.ALL;/* * 对应的表,多个的话以“,”分割 * return */String tables() default ;3. 创建一个操作记录实体类(也不是我写的,字段记录的很全)Componentpublic class OperateRecord DescAnnotation(description=唯一id)private String id;DescAnnotation(description=用户编号) private String userId;DescAnnotation(description=资源编码) private String rsrcCode;DescAnnotation(description=dict:tab操作类型:C:新增R:查询U:更新D:删除) private String opType;DescAnnotation(description=操作时间) private String opTime;DescAnnotation(description=操作结果) private String opResult;DescAnnotation(description=操作说明) private String opDesc;DescAnnotation(description=传入参数)private String params;DescAnnotation(description=修改前内容只记录修改的) private String prevContent;DescAnnotation(description=修改后内容) private String content;DescAnnotation(description=记录生成日期) private Date createTime;DescAnnotation(description=记录最后更新日期) private Date lastUpdTime;DescAnnotation(description=客户端ip)private String clientIp;/省略getter setter方法,省略 toString方法4. 创建一个测试对象public class Person implements Cloneable private Integer id;private String name;private Integer age;/省略getter setter 以及toString, clone 方法5. 用java集合创建一个模拟数据库(数据库操作不是这里讨论的重点)/* * 模拟一个数据库 * author dell * */public class DataBase private static int id=0;private static List datas = new ArrayList();private static List logs= new ArrayList();static/生成一些测试数据for (int i = 0; i 3; i+) Person p = new Person();p.setId(i);p.setName(名称_+i);p.setAge(10+i);datas.add(p);/下面是模拟数据库的操作public static Person get(int index)return datas.get(index);public static int add(Person op)return datas.add(op)?1:0;public static List list()return datas;public static int update(Person person)for (int i = 0; i datas.size(); i+) if(datas.get(i).getId()=person.getId()datas.set(i, person);return 1;return 0;public static int remove(int index)try datas.remove(index);return 1; catch (Exception e) e.printStackTrace();return 0;/往数据库里面添加日志public static int addLog(OperateRecord operateRecord)try logs.add(operateRecord);return 1; catch (Exception e) e.printStackTrace();return 0;public static List queryAllLogs()return logs;/用于模拟生成IDpublic synchronized static int getId()return id+;6. 修改之前TestService接口以及实现类public interface TestService public Person get(int id);public List list();public int add(Person erson);public int update(Person person);public int delete(int id);public class TestServiceImpl implements TestService/目标对象(添加,修改时候用到)private Person bean;/原始对象(修改时候用到)private Person oldBean;OperateLoger(content=查询单个对象操作,operationType=OperationType.R,noticeSystem=NoticeSystem.IN)public Person get(int id) return DataBase.get(id);OperateLoger(content=查询List操作,operationType=OperationType.R,noticeSystem=NoticeSystem.IN)public List list() return DataBase.list();OperateLoger(content=添加操作,operationType=OperationType.C,noticeSystem=NoticeSystem.ALL)public int add(Person person) return DataBase.add(person);OperateLoger(content=更改操作,operationType=OperationType.U,noticeSystem=NoticeSystem.ALL)public int update(Person person) return DataBase.update(person);OperateLoger(content=删除操作,operationType=OperationType.D,noticeSystem=NoticeSystem.ALL)public int delete(int id) return DataBase.remove(id);/省略getter setter 方法7. 重点改写LogerAspect 日志处理类(涉及到的工具类这里省略)AspectComponentpublic class LogerAspect Pointcut(execution (* com.manager.*.service.*.*(.)public void logAspect()Before(value = logAspect() & annotation(ol) /注意这里的变化public synchronized void beforeOperateLog(JoinPoint jp,OperateLoger ol)/记录日志暂时不考虑前置通知After(logAspect() & annotation(ol)public synchronized void addOperateLog(JoinPoint jp, OperateLoger ol)System.out.println(调用后置通知);OperateRecord operateRecord = new OperateRecord();tryString Ip = NetworkTools.getIpAddrByRequest();String opertionType = ol.operationType().toString();operateRecord.setId(DataBase.getId()+);operateRecord.setUserId(userId);/测试时候直接写死一个userid字符串operateRecord.setRsrcCode(ObjectUtils.getObjectName(jp.getSignature().getDeclaringTypeName() + _ + jp.getSignature().getName();operateRecord.setOpType(opertionType);operateRecord.setOpDesc(ol.content();operateRecord.setOpResult(true);operateRecord.setClientIp(Ip);operateRecord.setParams(Arrays.toString(jp.getArgs();operateRecord.setOpTime(new Random().nextInt(1000)+);/这里用随机数表示,实际操作时间需要计算operateRecord.setCreateTime(new Date();operateRecord.setLastUpdTime(new Date();/接下来查找更新时候,对象变化的字段Object obj = jp.getThis();Object targetObject = null;Map targetMap = null;if(ol.targetObject() != null & !.equals(ol.targetObject()Method targetMethod = null;try targetMethod = obj.getClass().getMethod(get + ol.targetObject(); catch (Exception e) e.printStackTrace();if(targetMethod = null)/如果没有方法的话,就给个默认的targetMap = new HashMap();elsetargetObject = targetMethod.invoke(obj);targetObject = AopTargetUtils.getTarget(targetObject);targetMap = ObjectUtils.getObjectValue(targetObject);Map oldMap = null;String dif = new String2;if(C.equals(opertionType) | R.equals(opertionType) | D.equals(opertionType)if(ol.targetObject() != null & !.equals(ol.targetObject()dif1 = ObjectUtils.convertMapToString(targetMap);dif0 = ; elseMethod oldMethod = obj.getClass().getMethod(get + ol.oldObject();Object oldObject = oldMethod.invoke(obj);oldObject = AopTargetUtils.getTarget(oldObject);oldMap = ObjectUtils.getObjectValue(oldObject);dif = ObjectUparisonMap(oldMap, targetMap);operateRecord.setPrevContent(dif0);operateRecord.setContent(dif1);String tables = ol.tables();/受影响的表(其他相关处理)DataBase.addLog(operateRecord);/模拟写入数据库catch(Exception e)e.printStackTrace();8. 添加单元测试方法public class TestModel ClassPathXmlApplicationContext context;TestService service;Beforepublic void before()context= new ClassPathXmlApplicationContext(application-context.xml);service =(TestService)context.getBean(testService);Afterpublic void after()System.out.println(查看日志.);List ops= DataBase.queryAllLogs();for (OperateRecord op : ops) System.out.println(op.toString();public void printData() for (Person p : DataBase.list() System.out.println(p.toString(); /* * 测试查询 * throws Exception */Testpublic void testGet() throws Exception Person p= service.get(0);/查询list类似,这里主要是看日志记录,不再重复 System.out.println(get id=+0+ : +p.toString();/* * 测试添加 */Testpublic void testAdd()Person p = new Pers

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论