我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring中的AOP编程怎么应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring中的AOP编程怎么应用

本文小编为大家详细介绍“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编程怎么应用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring中的AOP编程怎么应用

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

下载Word文档

猜你喜欢

Spring中的AOP编程怎么应用

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

Java的Spring AOP怎么用

这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通
2023-06-29

@Around注解怎么在Spring AOP中使用

这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务
2023-06-06

在Spring中AOP怎么使用注解来实现

这期内容当中小编将会给大家带来有关在Spring中AOP怎么使用注解来实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成A
2023-05-31

怎么在不使用spring框架中使用aop的功能

本篇文章为大家展示了怎么在不使用spring框架中使用aop的功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代
2023-06-22

Python中的元编程怎么应用

这篇“Python中的元编程怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的元编程怎么应用”文章吧。什
2023-07-05

怎么使用Spring AOP预处理Controller的参数

这篇文章主要为大家展示了“怎么使用Spring AOP预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”
2023-06-20

Vue中的组件化编程怎么应用

这篇文章主要介绍“Vue中的组件化编程怎么应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中的组件化编程怎么应用”文章能帮助大家解决问题。一.模块与组件,模块化与组件化对组件的理解如果以我们
2023-07-04

JavaScript中的函数式编程怎么应用

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

Spring的Controller怎么应用

今天小编给大家分享一下Spring的Controller怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述Contr
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录