如何在不使用spring框架中使用aop的功能

 更新时间:2022年01月03日 11:20:26   作者:Brrby  
这篇文章主要介绍了如何在不使用spring框架中使用aop的功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。

spring提供了两种方式的AOP使用

使用xml配置方式

在这里插入图片描述

使用注解方式

在这里插入图片描述

这里需要注意的是Spring AOP目前仅仅支持方法级别的切面,成员的interception并没有实现。另外,spring aop仅仅是集成框架,并没有参与aop的具体开发。

如果想利用aop的更多功能,或者在不使用spring的框架中使用aop的功能,该怎么办呢?

AspectJ简介

在这里插入图片描述

spring aop集成了AspectJ(可以和java编程语言无缝结合的一个面向切面编程的可扩展框架)

AspectJ的使用实例

Eclipse Marketplace安装插件AJDT

在这里插入图片描述

创建Aspect工程

在这里插入图片描述

创建AspectJ测试类

在这里插入图片描述

创建一个切面Aspect文件

在这里插入图片描述

.aj文件

在这里插入图片描述

运行HelloAspectJDemo的java程序,结果为:

在这里插入图片描述

不使用spring的aop功能实现日志输出

第一种

public class TimeBook {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 //审核数据的相关程序
 public void doAuditing(String name){undefined
  logger.log(Level.INFO, name + "开始审核数据...");
  System.out.println("审核程序");
  logger.log(Level.INFO, name + "审核数据结束...");
 }
}
//TestHelloWorld.java
package com.gc.test;
import com.gc.action.TimeBook;
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBook timeBook = new TimeBook();
  timeBook.doAuditing("张三");
 }
}

第二种:通过面向接口编程实现日志输出

public class TimeBook implements TimeBookInterface {undefined
 //审核数据的相关程序
 public void doAuditing(String name){undefined
  System.out.println("审核程序");
 }
}
//TimeBookProxy.java
package com.gc.action;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import com.gc.impl.TimeBookInterface;
public class TimeBookProxy {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private TimeBookInterface timeBookInterface;
 //在该类中针对前面的接口TimeBookInterface编程,而不是针对具体的类
 public TimeBookProxy(TimeBookInterface timeBookInterface){undefined
  this.timeBookInterface = timeBookInterface;
 }
 //实际业务处理
 public void doAuditing(String name){undefined
  logger.log(Level.INFO,"开始审核数据 "+name);
  timeBookInterface.doAuditing(name);
  logger.log(Level.INFO,"审核数据结束 "+name);
 }
}
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
  timeBookProxy.doAuditing("张三");
 }
}

第三种:使用java的代理机制进行日志输出

public class LogProxy implements InvocationHandler{undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private Object delegate;
 //绑定代理对象
 public Object bind(Object delegate){undefined
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(),this);
 }
 //针对接口编程
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {undefined
  Object result = null;
  try{undefined
   //在方法调用前后进行日志输出
   logger.log(Level.INFO,args[0]+" 开始审核数据...");
   result = method.invoke(delegate, args);
   logger.log(Level.INFO,args[0]+" 审核数据结束...");
  }catch(Exception e){undefined
   logger.log(Level.INFO,e.toString());
  }
  return result;
 }
}
//TimeBookInterface.java
package com.gc.impl;
//针对接口编程
public interface TimeBookInterface {undefined
 public void doAuditing(String name);
}
//TimeBook.java
public class TimeBook implements TimeBookInterface {undefined
 //审核数据的相关程序
 public void doAuditing(String name){undefined
  System.out.println("审核程序");
 }
}
//TestHelloWorld.java
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  //实现了对日志类的重用
  LogProxy logProxy = new LogProxy();
  TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
  timeBookProxy.doAuditing("张三");
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈java 增强型的for循环 for each

    浅谈java 增强型的for循环 for each

    下面小编就为大家带来一篇浅谈java 增强型的for循环 for each。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 用Java实现全国天气预报的api接口调用示例

    用Java实现全国天气预报的api接口调用示例

    查询天气预报在APP中常用的一个常用功能,本文实例讲述了java调用中国天气网api获得天气预报信息的方法。分享给大家供大家参考。
    2016-10-10
  • Java快速排序QuickSort(实例)

    Java快速排序QuickSort(实例)

    下面小编就为大家带来一篇Java快速排序QuickSort(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下
    2020-10-10
  • SpringBoot消息国际化配置实现过程解析

    SpringBoot消息国际化配置实现过程解析

    这篇文章主要介绍了SpringBoot消息国际化配置实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java实现桌球小游戏

    java实现桌球小游戏

    这篇文章主要为大家详细介绍了java实现桌球小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java中EasyPoi多sheet导出功能实现

    Java中EasyPoi多sheet导出功能实现

    这篇文章主要介绍了Java中EasyPoi多sheet导出功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解SpringBoot实现事件同步与异步监听

    详解SpringBoot实现事件同步与异步监听

    这篇文章主要通过示例为大家详细介绍了SpringBoot中的事件的用法和原理以及如何实现事件同步与异步监听,快跟随小编一起学习学习吧
    2022-06-06
  • SpringBoot整合MongoDB实现文件上传下载删除

    SpringBoot整合MongoDB实现文件上传下载删除

    这篇文章主要介绍了SpringBoot整合MongoDB实现文件上传下载删除的方法,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-05-05
  • Java多线程之线程池七个参数详解

    Java多线程之线程池七个参数详解

    这篇文章主要介绍了Java多线程之线程池七个参数详解,文中有很详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论