五个通知

​1)前置通知 :函数执行前增强
2)后置通知 :函数执行后增强,除非异常,最后执行
3)环绕通知 :函数执行的前后都增强
4)异常通知 :出现异常的时候执行
5)最终通知:不管出不出现异常,都会执行,类似于异常捕获finally


五个通知完全基于注解开发

  • 主类编写:
package Dao;
import org.springframework.stereotype.Component;@Component//注解  创建对象
public class UserLogin {public void login(){System.out.println("now is logining......");}
}

  • 代理类编写:
package Dao;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.junit.jupiter.api.Order;
import org.springframework.stereotype.Component;@Component//创建对象
@Aspect//切面   生成代理对象
public class UserLogin_Proxy {@Before(value = "execution(* Dao.UserLogin.login())")public void before(){System.out.println("在login前执行.....【前置通知】");}@After(value = "execution(* Dao.UserLogin.login())")public void after(){System.out.println("在login后执行.....但还没有返回返回值...【最终通知】");}@AfterReturning(value = "execution(* Dao.UserLogin.login())")public void afterReturning(){System.out.println("在login后执行.........在返回值之后(最后执行)...【后置通知(返回通知)】");}@Around(value = "execution(* Dao.UserLogin.login())")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{System.out.println("在login前执行........【环绕通知】");//被增强的方法执行   loginproceedingJoinPoint.proceed();System.out.println("在login后执行........【环绕通知】");}@AfterThrowing(value = "execution(* Dao.UserLogin.login())")public void afterThrowing(){System.out.println("在login产生异常时执行........【异常通知】");}
}

  • 配置类编写:
package Config_replace_xml;import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration//作为配置类,代替xml文件
@ComponentScan(basePackages = {"Dao"})
@EnableAspectJAutoProxy(proxyTargetClass = true)//开启Aspect生成代理对象public class Config_class {}

  • 测试类编写:
package TestPackage;import Config_replace_xml.Config_class;
import Dao.UserLogin;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestDemo2 {@Testpublic void Testdemo2(){ApplicationContext context =new AnnotationConfigApplicationContext(Config_class.class);UserLogin userLogin = context.getBean("userLogin", UserLogin.class);System.out.println(userLogin);userLogin.login();}
}

运行结果


  • 文件排布为:

配置文件基于xml编写(与上面结果等价)

  • 只需要删除配置类Config_class,再添加xml配置文件即可
  • xml文件如下:
<?xml version="1.0" encoding="UTF-8"?><!--命名空间设定  context   aop  -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解扫描--><context:component-scan base-package="Dao"></context:component-scan><!--开启代理对象--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

  • 测试类改写为:
package TestPackage;import Config_replace_xml.Config_class;
import Dao.UserLogin;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDemo2 {@Testpublic void Testdemo2(){ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");UserLogin userLogin = context.getBean("userLogin", UserLogin.class);System.out.println(userLogin);userLogin.login();}
}

测试结果等价

spring学习--AOP五个通知相关推荐

  1. Spring学习(五)bean装配详解之 【XML方式配置】

    本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...

  2. [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. spring之aop(前置通知,后置通知,环绕通知,过滤通知,异常通知)

    1.AOP中关键性概念  连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻辑 通知(Advice ...

  4. Spring学习(五)——Spring注解(一)

    ---恢复内容开始--- 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射 ...

  5. spring学习--AOP术语

    a)连接点:类里面哪些方法可以被增强,这些方法称为连接点 ​ b)切入点:实际被真正增强的方法称为切入点 ​ c)通知(增强):实际增强的逻辑部分称为通知,且分为以下五种类型: ​ 1)前置通知 :函 ...

  6. spring学习--------AOP的实现

    AOP AOP:aspect oriented programming,翻译过来为"面向切面编程". spring AOP就是将一些公共的功能,比如日志,安全等和业务代码结合,当执 ...

  7. Spring学习(五)—— 自动装配

    自动装配 搭建环境 首先,搭建环境 Cat.java package com.zhang.bean;/*** @title: Cat* @Author 张宜强* @Date: 2021/7/22 11 ...

  8. 【Spring学习】AOP实现日志记录

    AOP知识点 AOP,面向切面编程.通过预编译方式和运行时动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. AOP编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,减少 ...

  9. 【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)

    文章目录 前言 AOP与Spring AOP @Aspect简单案例快速入门 一.@Pointcut @annotation 二.五种通知Advice 1. @Before前置通知 2. @After ...

最新文章

  1. Swift常量和变量
  2. WebSocket实战之————Workerman服务器的安装启动
  3. python 输出结果图文混排_div css图文混排列表设计中的基础问题总结
  4. 数据仓库分层和元数据管理
  5. cli3解决 ie11语法错误 vue_【VUE3.0】它来了,2020年09月18日,Vue.js 3.0 正式发布,但是........
  6. Glide加载相同地址图片,不缓存
  7. OpenCV-腐蚀cv::erode
  8. python处理word文档 查找文字 加下划线_你能用Pythondocx在同一段落的某一部分加下划线吗?...
  9. Hibernate 枚举类型@Enumerated(EnumType.STRING)的应用
  10. python中if语句中可用break_python跳出if语句
  11. 年度最火的AOA蓝牙室内定位原理
  12. 学习Linux你必须知道的那些事儿
  13. 解决linux系统Error starting userland proxy: listen tcp 0.0.0.0:xxx端口: bind: address already in use端口占用问题
  14. 智能运营新功能,多波次营销全触达
  15. 与你分享如何做好企业汇算清缴
  16. Java接口 详解(二)
  17. gpu服务器厂家_嵌入式主板厂家告诉你选择GPU服务器的5大标准
  18. FX5UPLC的各种以太网通讯,SOCKET 2台PLC简单通讯 走网线
  19. sublime text 3经典颜色主题-Soda
  20. 算法优化专题A POJ-2352

热门文章

  1. 【机器学习】广义回归神经网络(GRNN)的python实现
  2. 相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)
  3. ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)
  4. Vue学习笔记之10-组件化开发
  5. 中value大小_如何在Spring/SpringBoot 中做参数校验?你需要了解的都在这里!
  6. 安卓9开机 bootanimation.zip_小米手机如何从安卓10退回安卓9系统,不丢失传感器,不变砖...
  7. LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)
  8. 自动化测试(二)如何用python写一个用户登陆功能
  9. 数据结构 队列Queue
  10. Web性能测试篇:AB 压力测试