返回顶部
首页 > 资讯 > 精选 >Spring中的AOP编程怎么应用
  • 107
分享到

Spring中的AOP编程怎么应用

2023-07-05 20:07:01 107人浏览 八月长安
摘要

本文小编为大家详细介绍“spring中的aop编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中的AOP编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。AOP 概述AOP 为 A

本文小编为大家详细介绍“spring中的aop编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中的AOP编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

AOP 概述

AOP 为 Aspect Oriented Programming 的缩写,是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型

AOP 可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP 中的动态代理主要有两种方式,jdk 动态代理和 CGLIB 动态代理。JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口

Spring中的AOP编程怎么应用

AOP 实现分类

AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能,按照 AOP 框架修改源代码的时机,可以将其分为两类:

  • 静态 AOP 实现, AOP 框架在编译阶段对程序源代码进行修改,生成了静态的 AOP 代理类(生成的 *.class 文件已经被改掉了,需要使用特定的编译器),比如 AspectJ。

  • 动态 AOP 实现, AOP 框架在运行阶段对动态生成代理对象(在内存中以 JDK 动态代理,或 CGlib 动态地生成 AOP 代理类),如 SpringAOP

AOP 术语

  • 连接点(JointPoint):与切入点匹配的执行点,在程序整个执行流程中,可以织入切面的位置,方法的执行前后,异常抛出的位置

  • 切点(PointCut):在程序执行流程中,真正织入切面的方法。

  • 切面(ASPECT):切点+通知就是切面

  • 通知(Advice):切面必须要完成的工作,也叫增强。即,它是类中的一个方法,方法中编写织入的代码。

  • 前置通知 后置通知

    • 环绕通知 异常通知

    • 最终通知

  • 目标对象(Target):被织入通知的对象

  • 代理对象(Proxy):目标对象被织入通知之后创建的新对象

通知的类型

Spring 方面可以使用下面提到的五种通知工作:

通知描述
前置通知在一个方法执行之前,执行通知。
最终通知在一个方法执行之后,不考虑其结果,执行通知。
后置通知在一个方法执行之后,只有在方法成功完成时,才能执行通知。
异常通知在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知。
环绕通知在一个方法调用之前和之后,执行通知。

基于 Aspectj 实现 AOP 操作

基于 Aspectj 实现 AOP 操作,经历了下面三个版本的变化,注解版是我们最常用的。

切入点表达式

作用:声明对哪个类中的哪个方法进行增强

语法:

execution([访问权限修饰符] 返回值 [ 类的全路径名 ] 方法名 (参数列表)[异常])

  • 访问权限修饰符:

    • 可选项,不写就是四个权限都包含

    • 写public就表示只包括公开的方法

  • 返回值类型

    • 必填项 * 标识返回值任意

  • 全限定类名

    • 可选项,两个点 … 表示当前包以及子包下的所有类,省略表示所有类

  • 方法名

    • 必填项 * 表示所有的方法 set*表示所有的set方法

  • 形参列表

    • 必填项

    • ()表示没有参数的方法

    • (…)参数类型和参数个数随意的方法

    • (*)只有一个参数的方法

    • (*,String) 第一个参数类型随意,第二个参数String类型

  • 异常信息

    • 可选项 省略时标识任何异常信息

Spring中的AOP编程怎么应用

第一版:基于xml(aop:config)配置文件

使用 Spring AOP 接口方式实现 AOP, 可以通过自定义通知来供 Spring AOP 识别对应实现的接口是:

  1. 前置通知:MethodBeforeAdvice

  2. 返回通知:AfterReturningAdvice

  3. 异常通知:ThrowsAdvice

  4. 环绕通知:MethodInterceptor

实现步骤:

定义业务接口

package cn.kGC.spring05.entity;public interface Teacher {    String teachOnLine(String course);    String teachOffLine(Integer course);}

2、定义实现类

package cn.kgc.spring05.entity;public class TeacherA implements Teacher{    @Override    public String teachOnLine(String course) {        System.out.println("TeacherA开始"+course+"课程线上教学");        if(course.equals("java")){            throw new RuntimeException("入门到放弃!");        }        return course+"课程线上教学";    }    @Override    public String teachOffLine(Integer course) {        System.out.println("TeacherA开始"+course+"课程线下教学");        return course+"课程线下教学";    }}

3、实现接口定义通知类

前置通知类

package cn.kgc.spring05.advice;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;//前置通知public class MyMethodBeforeAdvice implements MethodBeforeAdvice {    @Override    public void before(Method method, Object[] objects, Object o) throws Throwable {        System.out.println("------------spring aop 前置通知------------");    }}

后置通知类

package cn.kgc.spring05.advice;import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;public class MyAfterReturnAdvice implements AfterReturningAdvice {    @Override    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {        System.out.println("------------spring aop 后置通知------------");    }}

XML 配置方式

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="Http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">    <!--托管通知-->    <bean id="after" class="cn.kgc.spring05.advice.MyAfterReturnAdvice"></bean>    <bean id="before" class="cn.kgc.spring05.advice.MyMethodBeforeAdvice"></bean>    <bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean>    <!--AOP的配置-->    <aop:config>        <!--切点表达式-->        <aop:pointcut id="pt" expression="execution(* *(..))"/>        <aop:advisor advice-ref="before" pointcut-ref="pt"></aop:advisor>        <aop:advisor advice-ref="after" pointcut-ref="pt"></aop:advisor>    </aop:config></beans>

5、测试

package cn.kgc.spring05;import cn.kgc.spring05.entity.Teacher;import junit.framework.TestCase;import junit.framework.TestSuite;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:spring-config.xml")public class AppTest{    @Autowired    Teacher teacher;    @Test    public void teachOnLine() {        System.out.println(teacher.getClass());        String s = teacher.teachOnLine("java");        System.out.println("s = " + s);    }}

6、运行结果

Spring中的AOP编程怎么应用

第二版:基于xml(aop:aspect)配置文件

基于 xml(aop:config) 配置文件的方式,增加几个通知,就会创建几个通知类,那我们能否将这些通知类写在一个类中呢?下面就让我来带你们找到解决之法!

配置 AspectJ 标签解读表

Spring中的AOP编程怎么应用

实现步骤:

1、定义业务接口

package cn.kgc.spring05.entity;public interface Teacher {    String teachOnLine(String course);    String teachOffLine(Integer course);}

2、定义实现类

package cn.kgc.spring05.entity;public class TeacherA implements Teacher{    @Override    public String teachOnLine(String course) {        System.out.println("TeacherA开始"+course+"课程线上教学");        if(course.equals("java")){            throw new RuntimeException("入门到放弃!");        }        return course+"课程线上教学";    }    @Override    public String teachOffLine(Integer course) {        System.out.println("TeacherA开始"+course+"课程线下教学");        return course+"课程线下教学";    }}

3、实现接口定义通知类

package cn.kgc.spring05.advice;public class AllAdvice {    public void before(){System.out.println("------------前置通知--------------");}    public void afterReturning(){System.out.println("------------后置通知--------------");}    public void afterThrowing(){System.out.println("------------异常通知--------------");}    public void after(){System.out.println("------------最终通知--------------");}    public void around(){System.out.println("------------环绕通知--------------");}}

4、XML 配置方式

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">    <!--托管通知-->    <bean id="all" class="cn.kgc.spring05.advice.AllAdvice"></bean>    <bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean>    <!--AOP的配置-->    <aop:config>        <!--切点表达式-->        <aop:pointcut id="pt" expression="execution(* *(String))"/>        <aop:aspect ref="all">            <aop:before method="before" pointcut-ref="pt"></aop:before>            <aop:after-returning method="afterReturning" pointcut-ref="pt"></aop:after-returning>            <aop:after-throwing method="afterThrowing" pointcut-ref="pt"></aop:after-throwing>            <aop:after method="after" pointcut-ref="pt"></aop:after><!--            <aop:around method="around" pointcut-ref="pt"></aop:around>-->        </aop:aspect>    </aop:config></beans>

5、测试

package cn.kgc.spring05.advice;import cn.kgc.spring05.entity.Teacher;import junit.framework.TestCase;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:spring-config2.xml")public class AllAdviceTest{    @Autowired    Teacher teacher;    @Test    public void test01() {        System.out.println(teacher.getClass());        String s = teacher.teachOnLine("java");        System.out.println("s = " + s);    }}

6、运行结果

Spring中的AOP编程怎么应用

第三版:基于注解实现通知

  • 常用 “通知” 注解如下:

@Aspect 注解将此类定义为切面。
@Before 注解用于将目标方法配置为前置增强(前置通知)。
@AfterReturning 注解用于将目标方法配置为后置增强(后置通知)。
@Around 定义环绕增强(环绕通知)
@AfterThrowing 配置异常通知
@After 也是后置通知,与 @AfterReturning 很相似,区别在于 @AfterReturning 在方法执行完毕后进行返回,可以有返回值。@After 没有返回值。

实现步骤:

定义业务接口

package cn.kgc.spring05.entity;public interface Teacher {    String teachOnLine(String course);    String teachOffLine(Integer course);}

2、定义注解

package cn.kgc.spring05.advice;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface AnnoAdvice {}

3、定义实现类

package cn.kgc.spring05.entity;import cn.kgc.spring05.advice.AnnoAdvice;import org.springframework.stereotype.Component;@Componentpublic class TeacherA implements Teacher{    @Override    @AnnoAdvice    public String teachOnLine(String course) {        System.out.println("TeacherA开始"+course+"课程线上教学");        if(course.equals("java")){            throw new RuntimeException("入门到放弃!");        }        return course+"课程线上教学";    }    @Override    @AnnoAdvice    public String teachOffLine(Integer course) {        System.out.println("TeacherA开始"+course+"课程线下教学");        return course+"课程线下教学";    }}

4、实现接口定义切面类

首先在类上面添加 @Aspect 注解,将该类转化为切面类,再在类中的各个方法上面使用各自的 “通知” 注解即可实现。

package cn.kgc.spring05.advice;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;@Component@Aspectpublic class AllAdvice {    @Pointcut("@annotation(AnnoAdvice)")    public void point(){}    @Before("point()")    public void before(){System.out.println("------------前置通知--------------");}    @AfterReturning("point()")    public void afterReturning(){System.out.println("------------后置通知--------------");}    @AfterThrowing("point()")    public void afterThrowing(){System.out.println("------------异常通知--------------");}    @After("point()")    public void after(){System.out.println("------------最终通知--------------");}    @Around("point()")    public Object aroundAdvice(ProceedingJoinPoint joinPoint){        Object proceed = null;        try {            System.out.println("----------spring aop 环绕 前通知-----------");            proceed = joinPoint.proceed();            System.out.println("----------spring aop 环绕 后通知-----------");        } catch (Throwable throwable) {            throwable.printStackTrace();            System.out.println("----------spring aop 环绕 异常通知-----------");        }finally {            System.out.println("----------spring aop 环绕 最终通知-----------");        }        return proceed;    }}

5、XML 配置方式

开启包扫描和aspectj自动代理

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">    <!--开启包扫描-->    <context:component-scan base-package="cn.kgc.spring05"></context:component-scan>    <!--开启aspectj自动代理-->    <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

6、测试

package cn.kgc.spring05.advice;import cn.kgc.spring05.entity.Teacher;import junit.framework.TestCase;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:spring-config3.xml")public class AllAdviceTest{    @Autowired    Teacher teacher;    @Test    public void test01() {        System.out.println(teacher.getClass());        String s = teacher.teachOnLine("html");        System.out.println("s = " + s);    }}

7、运行效果

Spring中的AOP编程怎么应用

读到这里,这篇“Spring中的AOP编程怎么应用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Spring中的AOP编程怎么应用

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

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

猜你喜欢
  • Spring中的AOP编程怎么应用
    本文小编为大家详细介绍“Spring中的AOP编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中的AOP编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。AOP 概述AOP 为 A...
    99+
    2023-07-05
  • 一文吃透 Spring 中的 AOP 编程
    ✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识...
    99+
    2023-09-14
    spring java mybatis
  • Spring BOOT AOP基础应用教程
    目录面试课题 Spring boot AOPSpring boot 动态代理AOP 切面基本知识自定义注解自定义注解如何在AOP引用面试课题 Spring boot AOP Spri...
    99+
    2024-04-02
  • Java的Spring AOP怎么用
    这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为...
    99+
    2023-06-29
  • Spring aop的介绍和应用
    这篇文章主要讲解了“Spring aop的介绍和应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring aop的介绍和应用”吧! 前言前几...
    99+
    2024-04-02
  • ThinkPHP5怎么引入Go AOP和PHP AOP编程
    本篇内容主要讲解“ThinkPHP5怎么引入Go AOP和PHP AOP编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThinkPHP5怎么引入Go AOP和PHP AOP编程”吧!项目背景...
    99+
    2023-06-20
  • spring的aop有什么用
    Spring的AOP(面向切面编程)提供了一种以非侵入的方式将横切关注点(例如日志记录、事务管理、安全性检查等)与业务逻辑代码进行分...
    99+
    2023-08-09
    spring aop
  • Spring AOP标签怎么使用
    这篇文章主要介绍“Spring AOP标签怎么使用”,在日常操作中,相信很多人在Spring AOP标签怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP标签怎么使用”的疑惑有所帮助!...
    99+
    2023-06-02
  • @Around注解怎么在Spring AOP中使用
    这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务...
    99+
    2023-06-06
  • Spring中的AOP操作是什么
    本篇内容主要讲解“Spring中的AOP操作是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中的AOP操作是什么”吧!一、AOP操作术语 1. 连接点类里面哪些方法可以...
    99+
    2023-06-29
  • Spring中AOP的概念是什么
    这篇文章主要介绍“Spring中AOP的概念是什么”,在日常操作中,相信很多人在Spring中AOP的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中AOP的概念是什么”的疑惑有所帮助!...
    99+
    2023-07-02
  • Spring使用AspectJ的注解式实现AOP面向切面编程
    目录1、认识Spring AOP1.1 AOP的简介1.2 AOP中的概念 切入点(pointcut):2、认识AspectJ 2.1 AspectJ的简介2.2 Spring AO...
    99+
    2024-04-02
  • 在Spring中AOP怎么使用注解来实现
    这期内容当中小编将会给大家带来有关在Spring中AOP怎么使用注解来实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成A...
    99+
    2023-05-31
    spring aop
  • Python中的元编程怎么应用
    这篇“Python中的元编程怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的元编程怎么应用”文章吧。什...
    99+
    2023-07-05
  • 怎么在不使用spring框架中使用aop的功能
    本篇文章为大家展示了怎么在不使用spring框架中使用aop的功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代...
    99+
    2023-06-22
  • C#中AOP编程思想是什么
    这篇文章给大家分享的是有关C#中AOP编程思想是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是AOPAOP:Aspect Oriented Programming的缩写,意为面向切面编程,通过预编译...
    99+
    2023-06-29
  • Python 中如何编写高效的 Spring 应用程序?
    Python 和 Spring 是两个非常流行的编程语言和框架,它们分别在不同的领域中广泛应用。但是,在某些情况下,我们需要将它们结合起来,以创建高效的应用程序。在本文中,我们将探讨如何使用 Python 编写高效的 Spring 应用程序...
    99+
    2023-08-31
    教程 spring numpy
  • Node.js中怎么应用反应式编程
    本篇内容主要讲解“Node.js中怎么应用反应式编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中怎么应用反应式编程”吧!反应式编程提供了先进的...
    99+
    2024-04-02
  • Java Spring之XML的AOP怎么配置
    本篇内容主要讲解“Java Spring之XML的AOP怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Spring之XML的AOP怎么配置”吧!1 环境搭建示例:在学习 spr...
    99+
    2023-07-05
  • JavaScript中的AOP编程的基本实现
    AOP 简介 AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等。把这些功能抽离出来之后, ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作