AOP的实现方式有哪些具体应用场景?

2026-06-11 07:284阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1375个文字,预计阅读时间需要6分钟。

AOP的实现方式有哪些具体应用场景?

AOP(面向切面编程)是一种编程范式,通过预编译和运行时动态代理实现。它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,以实现代码的复用和模块化。AOP的主要实现方式包括:

1. 预编译方式:通过编译器将AOP代码编译到目标程序中。

2.运行时动态代理:在程序运行时动态创建代理对象,实现AOP功能。

AOP的主要优势在于:

- 降低代码耦合度:将横切关注点从业务逻辑中分离,降低代码之间的耦合。

- 提高代码复用性:横切关注点可以在多个业务逻辑中复用。- 提高代码可维护性:易于管理和维护横切关注点。

简单来说,AOP就是将横切关注点从业务逻辑中分离出来,通过预编译或运行时动态代理实现。

AOP及实现方式一、AOP简介1.1什么是AOPAOP(AspectOrientedProgramming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护

AOP及实现方式

一、AOP简介

1.1 什么是AOP

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

1.2 Aop在Spring中的作用

提供声明式事务;允许用户自定义切面

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 ....

    AOP的实现方式有哪些具体应用场景?

  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。

  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。

  • 目标(Target):被通知对象。

  • 代理(Proxy):向目标对象应用通知之后创建的对象。

  • 切入点(PointCut):切面通知 执行的 “地点”的定义。

  • 连接点(JointPoint):与切入点匹配的执行点。

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

即AOP在不改变原有代码的情况下,去增加新的功能。

1.3 使用Spring实现Aop

使用AOP织入,需要导入一个依赖包。

org.aspectj aspectjweaver 1.9.4

第一种方式:

通过Spring API来实现,首先编写业务接口和实现类

public interface UserService { void add(); void delete(); void update(); void select();}public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加一个用户"); }? @Override public void delete() { System.out.println("删除一个用户"); }? @Override public void update() { System.out.println("更新一个用户"); }? @Override public void select() { System.out.println("查找一个用户"); }}

然后编写增强类,一个前置增强,一个后置增强

public class Log implements MethodBeforeAdvice {? //method:要执行的目标的方法 //args:要调用的方法的参数 //target:目标对象 @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行了"); }}public class AfterLog implements AfterReturningAdvice {// returnValue 返回值// method 被调用的方法// args 被调用的方法的对象的参数// target 被调用的目标对象 @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+target.getClass().getName()+"的"+method.getName()+"方法,"+"返回值:"+returnValue); }}

最后去spring的文件中注册,实现aop切入实现。

? ? ?

测试:

第二种方式:

自定义类来实现Aop

目标业务类依旧是userServiceImpl

  • 写一个自己的切入类

    public class DiyPointCut { public void before(){ System.out.println("------方法执行前-------"); } public void after(){ System.out.println("------方法执行后-------"); }}

    在spring中进行配置:

  • 第三种方式实现:

    使用注解实现

  • 编写一个注解实现的增强类

    @Aspectpublic class AnnotationPointCut {? @Before("execution(* com.aishimin.service.UserServiceImpl.*(..))") public void before(){ System.out.println("方法执行前"); }? @After("execution(* com.aishimin.service.UserServiceImpl.*(..))") public void after(){ System.out.println("方法执行后"); }? public void around(ProceedingJoinPoint pj) throws Throwable{ System.out.println("环绕前"); System.out.println("签名:"+pj.getSignature()); Object proceed = pj.proceed(); System.out.println("环绕后"); System.out.println(proceed); }}

  • 在spring配置文件中,注册bean,并增加支持注解的支持

    ?

    aop:aspectj-autoproxy/说明:

    通过aop命名空间的注解支持声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被aop:aspectj-autoproxy/注解支持隐藏起来了。

    有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。

  • 本文共计1375个文字,预计阅读时间需要6分钟。

    AOP的实现方式有哪些具体应用场景?

    AOP(面向切面编程)是一种编程范式,通过预编译和运行时动态代理实现。它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,以实现代码的复用和模块化。AOP的主要实现方式包括:

    1. 预编译方式:通过编译器将AOP代码编译到目标程序中。

    2.运行时动态代理:在程序运行时动态创建代理对象,实现AOP功能。

    AOP的主要优势在于:

    - 降低代码耦合度:将横切关注点从业务逻辑中分离,降低代码之间的耦合。

    - 提高代码复用性:横切关注点可以在多个业务逻辑中复用。- 提高代码可维护性:易于管理和维护横切关注点。

    简单来说,AOP就是将横切关注点从业务逻辑中分离出来,通过预编译或运行时动态代理实现。

    AOP及实现方式一、AOP简介1.1什么是AOPAOP(AspectOrientedProgramming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护

    AOP及实现方式

    一、AOP简介

    1.1 什么是AOP

    AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

    1.2 Aop在Spring中的作用

    提供声明式事务;允许用户自定义切面

    • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 ....

      AOP的实现方式有哪些具体应用场景?

    • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。

    • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。

    • 目标(Target):被通知对象。

    • 代理(Proxy):向目标对象应用通知之后创建的对象。

    • 切入点(PointCut):切面通知 执行的 “地点”的定义。

    • 连接点(JointPoint):与切入点匹配的执行点。

    SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

    即AOP在不改变原有代码的情况下,去增加新的功能。

    1.3 使用Spring实现Aop

    使用AOP织入,需要导入一个依赖包。

    org.aspectj aspectjweaver 1.9.4

    第一种方式:

    通过Spring API来实现,首先编写业务接口和实现类

    public interface UserService { void add(); void delete(); void update(); void select();}public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加一个用户"); }? @Override public void delete() { System.out.println("删除一个用户"); }? @Override public void update() { System.out.println("更新一个用户"); }? @Override public void select() { System.out.println("查找一个用户"); }}

    然后编写增强类,一个前置增强,一个后置增强

    public class Log implements MethodBeforeAdvice {? //method:要执行的目标的方法 //args:要调用的方法的参数 //target:目标对象 @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行了"); }}public class AfterLog implements AfterReturningAdvice {// returnValue 返回值// method 被调用的方法// args 被调用的方法的对象的参数// target 被调用的目标对象 @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+target.getClass().getName()+"的"+method.getName()+"方法,"+"返回值:"+returnValue); }}

    最后去spring的文件中注册,实现aop切入实现。

    ? ? ?

    测试:

    第二种方式:

    自定义类来实现Aop

    目标业务类依旧是userServiceImpl

  • 写一个自己的切入类

    public class DiyPointCut { public void before(){ System.out.println("------方法执行前-------"); } public void after(){ System.out.println("------方法执行后-------"); }}

    在spring中进行配置:

  • 第三种方式实现:

    使用注解实现

  • 编写一个注解实现的增强类

    @Aspectpublic class AnnotationPointCut {? @Before("execution(* com.aishimin.service.UserServiceImpl.*(..))") public void before(){ System.out.println("方法执行前"); }? @After("execution(* com.aishimin.service.UserServiceImpl.*(..))") public void after(){ System.out.println("方法执行后"); }? public void around(ProceedingJoinPoint pj) throws Throwable{ System.out.println("环绕前"); System.out.println("签名:"+pj.getSignature()); Object proceed = pj.proceed(); System.out.println("环绕后"); System.out.println(proceed); }}

  • 在spring配置文件中,注册bean,并增加支持注解的支持

    ?

    aop:aspectj-autoproxy/说明:

    通过aop命名空间的注解支持声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被aop:aspectj-autoproxy/注解支持隐藏起来了。

    有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。