iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java面向切面编程AOP怎么实现
  • 863
分享到

Java面向切面编程AOP怎么实现

2023-06-04 14:06:10 863人浏览 泡泡鱼
摘要

这篇文章主要介绍“Java面向切面编程aop怎么实现”,在日常操作中,相信很多人在Java面向切面编程AOP怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向切面编程AOP怎么实现”的疑惑有所

这篇文章主要介绍“Java面向切面编程aop怎么实现”,在日常操作中,相信很多人在Java面向切面编程AOP怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向切面编程AOP怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一:背景
spring的AOP的存在目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来是代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OPP的不足。

二:概述  Spring支持AspectJ的注解方式切面编程

1.使用@Aspect 声明一个切面。

2.使用@After,@Before,@Around 定义建言(advice),可直接将拦截规则(切点)作为参数。

3.其中@After,@Before,@Around参数的拦截规则为切点(PointCut) ,为了使切点复用,可使用@PointCut 专门定义拦截规则,然后在@After,@Before,@Around的参数中调用。

4.其中符合条件的每一个被拦截处为连接点(JoinPoint)

三:代码实例

1.pom.xml


点击(此处)折叠或打开

  1. <dependency>

  2.             <groupId>org.springframework</groupId>

  3.             <artifactId>spring-core</artifactId>

  4.         </dependency>

  5.         <dependency>

  6.             <groupId>org.springframework</groupId>

  7.             <artifactId>spring-beans</artifactId>

  8.         </dependency>

  9.         <dependency>

  10.             <groupId>org.springframework</groupId>

  11.             <artifactId>spring-context</artifactId>

  12.         </dependency>

  13.         <dependency>

  14.             <groupId>org.springframework</groupId>

  15.             <artifactId>spring-aop</artifactId>

  16.         </dependency>

  17.         <dependency>

  18.             <groupId>org.aspectj</groupId>

  19.             <artifactId>aspectjrt</artifactId>

  20.         </dependency>

  21.         <dependency>

  22.             <groupId>org.aspectj</groupId>

  23.             <artifactId>aspectjweaver</artifactId>

  24.         </dependency>

拦截规则的注解


点击(此处)折叠或打开

  1. @Target(ElementType.METHOD)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

  4. public @interface Action {

  5.     String name();

  6. }

注解的被拦截类


点击(此处)折叠或打开

  1. @Service

  2. public class DemoAnnotationService {

  3.     @Action(name = "注解式拦截的add操作")

  4.     public void add() {

  5.        System.out.println("======DemoAnnotationService方法add()=========");

  6.     }

  7. }

方法规则被拦截类


点击(此处)折叠或打开

  1. @Service

  2. public class DemoMethodService {

  3.     public String add() throws Exception{

  4.         System.out.println("======DemoMethodService方法add()=========");

  5.         int i=100/0;

  6.         return "SUCCESS";

  7.     }

  8. }


4.编写切面


点击(此处)折叠或打开

  1. @Aspect

  2. @Component

  3. public class LogAspect {

  4.     @Pointcut("@annotation(com.gemdale.gmap.spring.boot.demo.Action)")

  5.     public void annotationPointCut() {

  6.     }

  7.     @After("annotationPointCut()")

  8.     public void after(JoinPoint joinPoint) {

  9.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();

  10.         Method method = signature.getMethod();

  11.         Action action = method.getAnnotation(Action.class);

  12.         System.out.println("注解式拦截 " + action.name());

  13.     }

  14.     @Before("execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))")

  15.     public void methodBefore(JoinPoint joinPoint) {

  16.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();

  17.         Method method = signature.getMethod();

  18.         System.out.println("before方法规则式拦截 " + method.getName());

  19.     }

  20.     @After("execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))")

  21.     public void methodAfter(JoinPoint joinPoint) {

  22.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();

  23.         Method method = signature.getMethod();

  24.         System.out.println("after方法规则式拦截 " + method.getName());

  25.     }

  26.     @AfterReturning(pointcut = "execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))", returning = "result")

  27.     public void methodAfterResult(JoinPoint joinPoint, Object result) {

  28.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();

  29.         Method method = signature.getMethod();

  30.         System.out.println("after result方法规则式拦截 " + method.getName() + "result=" + result);

  31.     }

  32.     @AfterThrowing(pointcut = "execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))", throwing = "e")

  33.     public void methodAfterException(JoinPoint joinPoint, Exception e) {

  34.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();

  35.         Method method = signature.getMethod();

  36.         System.out.println("after exception方法规则式拦截 " + method.getName() + " e=" + e.getMessage());

  37.     }

  38. }

配置类


点击(此处)折叠或打开

  1. @Configuration

  2. @ComponentScan("com.gemdale")

  3. @EnableAspectJAutoProxy

  4. public class AppliactionConfig {

  5. }


6.执行类


点击(此处)折叠或打开

  1. public class Start {

  2.     public static void main(String[] args) throws Exception{

  3.         AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(

  4.                 AppliactionConfig.class);

  5.         // UseFunctionService

  6.         // useFunctionService=configApplicationContext.getBean(UseFunctionService.class);

  7.         // System.out.println(useFunctionService.sayHello("GenGChong"));

  8.         DemoAnnotationService demoAnnotationService = configApplicationContext.getBean(DemoAnnotationService.class);

  9.         DemoMethodService demoMethodService = configApplicationContext.getBean(DemoMethodService.class);

  10.         demoAnnotationService.add();

  11.         demoMethodService.add();

  12.         configApplicationContext.close();

  13.     }

  14. }

到此,关于“Java面向切面编程AOP怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java面向切面编程AOP怎么实现

本文链接: https://www.lsjlt.com/news/238213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作