Spring AOP 入门 AspectJ + XML

Spring(3)-AOP快速入门 经过前面两篇内容,我们可以引入AOP了。 阅读详情

Spring AOP 入门 AspectJ + XML

一、AOP开发相关术语

  1. JoinPoint:连接点。可以被拦截到的点(增删改查的方法都可以被增强,这些方法就可以成为是连接点)
  2. Pointcut:切入点。真正被拦截到的点。
  3. Advice:通知、增强。对方法做权限校验、日志功能的方法称为是通知。
  4. Introduction:引介。类层面的增强。
  5. Target:被增强的对象。
  6. Weaving:织入。将通知(Advice)应用到目标(Target)的过程。
  7. Proxy:代理对象。
  8. Aspect:切面。多个通知和多个切入点的组合。

二、AspectJ + XML方式开发AOP

  • 创建Maven项目引入相应的pom
  • 引入Spring的配置文档 applicationContext.xml
  • 编写目标接口(Target)及实现类(以用户的增删改查为例,只模拟,无实际意义)并完成配置
    UsersDao.java
public interface UsersDao {
    /**
     * 增
     */
    void save();

    /**
     * 删
     */
    void delete();

    /**
     * 改
     */
    void update();

    /**
     * 查
     */
    void find();
}

UsersDaoImpl.java

public class UsersDaoImpl implements UsersDao {
    @Override
    public void save() {
        System.out.println("增加用户信息业务逻辑代码");
    }

    @Override
    public boolean delete() {
        System.out.println("删除用户信息业务逻辑代码");
        return true;
    }

    @Override
    public void update() {
        System.out.println("更新用户信息业务逻辑代码");

    }

    @Override
    public void find() {
        System.out.println("查询用户信息业务逻辑代码");
        // 演示异常通知时打开
       // int i = 10 / 0;
    }
}

save演示前置通知

delete演示后置通知

update演示环绕通知

find演示异常通知和最终通知

将bean交给spring管理

    <!--配置目标对象:被增强的对象-->
    <bean id="userDao" class="edu.xufe.dao.impl.UsersDaoImpl"></bean>
  • 编写测试类UsersDaoTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class UsersDaoTest {
    @Resource(name = "usersDao")
    private UsersDao usersDao;

    @Test
    public void test() {
        usersDao.save();
        usersDao.update();
        usersDao.update();
        usersDao.update();
    }
}
  • 编写切面类 MyAspectXml
public class MyAspectXml {
    /**
     * 前置通知
     *
     * @param joinPoint
     */
    public void permissionToCheck(JoinPoint joinPoint) {
        System.out.println("权限校验业务逻辑代码........." + joinPoint);
    }

    /**
     * 后置通知
     */
    public void writeLog(Object result) {
        System.out.println("日志业务逻辑代码........." + result);
    }

    /**
     * 环绕通知
     *
     * @param proceedingJoinPoint
     * @return
     */
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知方法执行前业务逻辑代码。。。。。。。。。");

        Object object = proceedingJoinPoint.proceed();

        System.out.println("环绕通知方法执行后业务逻辑代码。。。。。。。。。");
        return object;
    }

    /**
     * 异常通知
     */
    public void afterThrowing(Throwable e) {
        System.out.println("异常通知逻辑代码........." + e);
    }

    public void after() {
        System.out.println("最终通知逻辑代码.........");
    }
}
  • 将切面类交给Spring管理
     <!--将切面类交给Spring管理-->
    <bean id="myAspect" class="edu.xufe.aspect.MyAspectXml"></bean>
  • AOP配置
    <aop:config>
        <!--表达式配置哪些类的哪些方法需要增强-->
        <aop:pointcut id="pointcut1" expression="execution(* edu.xufe.dao.impl.UsersDaoImpl.save(..))"/>
        <!--配置切面-->
        <aop:aspect ref="myAspect">
            <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>
  • 再次测试

三、Spring中通知类型

  • 前置通知:在目标方法执行之前进行操作
    • 前置通知可获得切入点信息
 <!--配置切面-->
        <aop:aspect ref="myAspect">
            <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
        </aop:aspect>
  • 后置通知:在目标方法执行之后进行操作
    • 后置通知可获得方法的返回值 改delete()方法有返回值
  <aop:pointcut id="pointcut2" expression="execution(* edu.xufe.dao.impl.UsersDaoImpl.delete(..))"/>
<!--配置切面-->
      <aop:aspect ref="myAspect">
          <!--前置通知-->
          <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
          <!--后置通知-->
          <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
      </aop:aspect>
  • 环绕通知:在目标方法执行之前和之后进行操作
    • 环绕通知:
 <aop:pointcut id="pointcut3" expression="execution(* edu.xufe.dao.impl.UsersDaoImpl.update(..))"/>    
 <!--配置切面-->
        <aop:aspect ref="myAspect">
            <!--前置通知-->
            <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
            <!--后置通知
                result 用于获取返回值
                需要与writeLog方法参数同名
            -->
            <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
            <!--环绕通知-->
            <aop:around method="around" pointcut-ref="pointcut3"/>
        </aop:aspect>
  • 异常抛出通知:在程序出现异常的时候,进行操作
<aop:pointcut id="pointcut4" expression="execution(* edu.xufe.dao.impl.UsersDaoImpl.find(..))"/>
 <!--配置切面-->
        <aop:aspect ref="myAspect">
            <!--前置通知-->
            <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
            <!--后置通知
                result 用于获取返回值
                需要与writeLog方法参数同名
            -->
            <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
            <!--环绕通知-->
            <aop:around method="around" pointcut-ref="pointcut3"/>
            <!--异常通知-->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="e"/>
        </aop:aspect>
  • 最终通知:无论代码是否有异常,总是会执行
 <!--配置切面-->
        <aop:aspect ref="myAspect">
            <!--前置通知-->
            <aop:before method="permissionToCheck" pointcut-ref="pointcut1"/>
            <!--后置通知
                result 用于获取返回值
                需要与writeLog方法参数同名
            -->
            <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
            <!--环绕通知-->
            <aop:around method="around" pointcut-ref="pointcut3"/>
            <!--异常通知-->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="e"/>
            <!--最终通知-->
            <aop:after method="after" pointcut-ref="pointcut4"/>
        </aop:aspect>
  • 引介通知:

四、Spring切入点表达式写法

  • 基于execution的函数完成的
  • 语法
    • [访问修饰符]方法返回值 包名.类名.方法名(参数)
    • public edu.xufe.dao.impl.UsersDaoImpl.save(..)
    • *代表任一
    • * *.*.*.*.*.*Dao.save(..) 表示xxxDao下的save()方法
    • * edu.xufe.dao.impl.UsersDaoImpl+save(..) 表示当前类及子类下的save()方法

该目标类实现了接口,所以我们可以在调试过程中看见AOP底层是使用了Jdk动态代理

Spring 5 框架【完整版】 Spring 5 框架【完整版】Spring 5 框架一、Spring 简介1、Spring特点2、下载spring5资源1-百度网盘2-网页下载3、入门案例1.案例一(入门)二、IOC容器1、什么是IOC(概念和原理)1.1、什么是IOC(控制反转)1.2、 IOC底层1.3、IOC底层原理过程2、IOC(接口)3、IOC操作Bean管理3.1、什么是Bean管理3.2、Bean管理操作有两种工作方式(1)基于xml配置文件方式实现(2)基于注解方式实现4、IOC操作Bean管理( 基于xml配置文件方式 阅读详情

相关推荐

从零复刻平衡小车(基于STM32F1)

平衡小车(基于STM32F1)

Legendyyy的博客 5041

Spring AOP(面向切面编程)【不同类型的Advice】

Spring AOP编程的核心是通过IoC生成代理对象,代理对象的配置通常有如下几个属性:

秋水の歌的专栏 682

LabVIEW Modbus TCP通信避坑指南:解决连接中断、服务器异常与自动重连问题

本文详细解析了LabVIEW环境下Modbus TCP通信的常见问题,包括连接中断、服务器异常等,并提供了自动重连机制的实现方案。通过优化错误处理、超时参数和资源管理,帮助开发者构建更稳定的工业级Modbus TCP客户端,显著提升通信可靠性。

weixin_42525211的博客 424

Spring之AOP基于AspectJ的XML开发配置详解

一、Advice通知类型 1.前置通知before--目标方法执行前需要增强的方法执行 &lt;aop:before method="checkPri" pointcut-ref="pt"/&gt; 2.后置通知after-returning--目标方法执行后需要增强的方法执行,可返还一个参数 &lt;aop:after-returning method="writeLog" poin...

绣花针 332

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

RAG 实战:LangChain + 向量数据库构建知识问答系统

从文档加载、分割、嵌入到检索增强生成,完整实现一个基于本地文档的知识问答系统。

kaixin110a的博客 188

Spring的AOP入门(AspectJ的XML 方式)

1.引入Jar包 2.引入Spring的配置文件 引入AOP的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan...

没有到不了的明天 224

(三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)

整个Soc架构中一般会存在多个Power Domain,不同的Power Domain之间也存在着一定的Coverage关系。在Cadence工具中,这种。不同的Domain Coverage关系中,各个Domain存在着一定的关联()。

Mr.翟的博客 1424

Spring4 AOP入门(AspectJ的XML的方式)

1 创建web项目 2 引入jar包(spring的4个+2个日志+4个aop相关包) 3 编写applicationContext.xml配置文件 A 引入aop的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/bean...

23号员工的博客 314

【虚幻引擎UE】UE5 阴影异常与优化

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

灵境引路人 3万+

Simulink进行无人机飞行力学建模与仿真

摘要:本文详细介绍了使用MATLAB/Simulink进行四旋翼无人机飞行力学建模与仿真的步骤。内容包括准备工作、动力学方程概述、模型构建(使用State-Space或Simscape Multibody)、可选控制器设计、仿真参数配置及结果分析。教程强调理解飞行力学原理和坐标系转换的重要性,建议根据需求选择模型复杂度,并推荐查阅学术文献获取更深入的建模方法。通过本教程,读者可掌握无人机动力学建模基础,为控制系统开发和性能优化奠定基础。

amy_mhd的博客 272

Spring+Aspectj+Maven使用xml方式实现aop入门示例

一、本文摘要 实现AOP的方式采用Spring+Aspectj+Maven+XML配置; 介绍五种通知方式:前置通知、后置通知、环绕通知、异常通知、异常后置通知; 二、在POM中引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" ...

叶遮沉阳的博客 562

手把手教你学Simulink——基于Simulink的无迹卡尔曼滤波(UKF)控制仿真建模示例

本文详细介绍了在Simulink中实现无迹卡尔曼滤波(UKF)控制倒立单摆系统的完整过程。通过对比扩展卡尔曼滤波(EKF),重点阐述了UKF在处理强非线性系统时的优势:采用无迹变换(UT)通过确定性采样捕捉非线性特性,精度可达三阶泰勒展开且无需计算雅可比矩阵。文章分步骤讲解了状态空间定义、UKF参数设计、Simulink实现方法,以及结合LQR控制器的闭环系统搭建,并通过仿真验证UKF在大角度偏移情况下具有更优的估计精度和控制性能。最后还讨论了工程实践要点和扩展方向,为非线性系统控制提供了实用解决方案。

MHD0815的博客 96

Spring - 8 AspectJ的XML方式完成AOP开发的入门

    技术分析之AOP的相关术语 1. Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点 2. Pointcut(切入点) -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义 3. Advice(通知/增强) -- 所谓通知是指拦截到Joinpoint...

alexzt的博客 249

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring的AOP开发入门,Spring整合Junit单元测试(基于ASpectJ的XML方式)

参考自 https://www.cnblogs.com/ltfxy/p/9882430.html 创建web项目,引入jar包 除了基本的6个Spring开发的jar包外,还要引入aop开发相关的四个jar包: 附jar包链接:链接:https://pan.baidu.com/s/1E_8NA-DcWwt9hdK-czkm9A 提取码:xq8n 除此之外,Spring要整合Juni...

weixin_30892987的博客 247

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)

创建web项目,引入jar包 引入Spring配置文件 编写目标类,完成配置 编写测试类 Spring整合Junit单元测试 编写一个切面类 配置切面类,产生代理: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframe...

weixin_30736301的博客 208

Spring:Spring的基于AspectJ的AOP开发

Spring的基于AspectJ的AOP开发   一、AspectJ简介 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对AspectJ切点表达式支持 @AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面 新版本Spring框架,建议使用AspectJ方式来开发AOP 使用AspectJ需要导入Spring AOP和...

Derrick 325

spring-aop入门

OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

weixin_45732391的博客 452

Spring6详细学习笔记(IOC+AOP)

System.out.println("Spring 测试!");Spring通过IoC容器来管理所有的Java对象的实例化和初始化控制着对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象称为 Spring Bean,它与使用关键字 new 创建的Java对象没有任何区别类有属性,创建对象过程中,向属性注入具体的值,所谓的注入其实就是给依赖的成员变量赋值创建实体类/***/下面通过配置文件实现。

泰勒今天想展开的博客 1776

05-AOP(面向切面编程)XML

1、什么是AOP AOP是面向切面编程,AOP是OOP的延伸和扩展,用来解决OOP遇到的问题。 2、为什么学习AOP 在不修改源码的情况下可以对程序进行增强 AOP可以进行权限校验,日志记录,性能监控,事务控制 AOP的底层实现为动态代理 JDK动态代理 :只能对实现了接口的类产生代理 Cglib动态代理:对没有实现接口的类产生代理,生成子类。(类似javassist第三方代理) Spring可以在上面两种代理方式中自动切换 3、Spring的AOP简介 Spring的AOP有自己的

Python研究所 468

Spring jdbc及事务

Spring的IOC的注解开发 注解的入门 引入aop的包 引入context约束 <context:component-scan /> <context:annotation-config /> 使用注解开发 @Component :定义Bean @Controller :WEB层 @...

yasuoi的博客 176

Spring——AOP

AOP 面向切面编程,Spring中的可插拔组件技术 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 作用 将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行的时候,再将这些抽取出来的代码应用到需要执行的地方。 入门案例 第一步:导入依赖 <dependency> <groupId>org.aspectj&lt

qq_45169180的博客 281

《Spring攻略》第3章 Spring AOP和AspectJ支持

1启用Spring的AspectJ注解支持 问题: Spring支持在其AOP框架中使用AspectJ注解编写的POJO aspect。但是,你必须首先启用Spring中的AspectJ注解支持。 解决方案: 你只需要在Bean配置文件中定义一个空的XML元素&lt;aop:aspectj-autoproxy/&gt;,就可以启用Spring IoC容器中的AspectJ注解支持。 然后...

爱.NET 225

Spring Day 2

**Spring框架的IOC之注解方式的快速入门** 步骤一:导入注解开发所有需要的jar包 步骤二:创建对应的包结构,编写Java的类:接口到实现类 步骤三:在src的目录下,创建applicationContext.xml的配置文件,然后引入约束。注意:因为现在想使用注解的方式,那么引入的约束发生了变化 步骤四:在applicationContext.xml配置文件中开启组件扫描 可...

weixin_30627381的博客 95

Spring--入门第二天【AspectJ通知类型--注解写法(基于XML)】

1.扫包 <context:component-scan base-package="xunfang"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 2.替换service @Service("userService") public class UserServiceImpl implements UserService{ public .

qq_41048982的博客 159

Spring入门第六讲——Spring AOP的XML开发

Spring的bean管理(注解方式)注解:代码中的特殊标记,注解可以使用在类、方法、属性上面,使用注解可实现一些基本的功能。注解的写法是@注解名称(属性=属性值)。使用注解创建对象第一步,创建Web项目,引入Spring的开发包 除了导入Spring基本的Jar包外(可参考《Spring的概述》一文),还须导入Spring注解的Jar包,如下: 第二步,编写相关的类 在src目录下创建一

李阿昀的博客 1万+
上一篇: spring Bean的获取与注入
下一篇: Spring AOP 入门 注解
GreatDistance
博客等级 码龄9年 1粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值