spring aop的5种通知类型都有

Before前置通知

AfterReturning后置通知

Around环绕通知

AfterThrowing异常通知

After最终通知

首先创建接口和实现类 先测试后置通知

package com.aaa.spring.dao;

public interface UserService {

    public void insertUser();

    public void updateUser();

    public void deleteUser();

    public void find();
}
package com.aaa.spring.dao.umpl;

import com.aaa.spring.dao.UserService;
import com.aaa.spring.exception.MyException;
import org.springframework.stereotype.Component; @Component(创建userServiceImpl bean)
public class UserServiceImpl implements UserService {
@Override
public void insertUser() {
System.out.println("添加用户");
} @Override
public void updateUser() {
System.out.println("修改用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
} @Override
public void find() {
System.out.println("查询用户");
}
}

创建要在执行的方法前后的类

package com.aaa.spring.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component(获取bean对象)
@Aspect(面向切面)
public class LogAdvice {
@AfterReturning("execution(void *User(..))")(后置通知(切入点))
public void log(JoinPoint jp){  (JoinPoint 连接点参数)
String name=jp.getSignature().getName();(获取拦截的方法名)
System.out.println(name+"执行之后记录成功");
}
}

创建ApplicationContext文件

<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework
    .org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework
    .org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.aaa.spring"></context:component-scan>(扫描创建bean的包就是加@Component的类的所有包)
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>(声明以注解的方式配置spring aop)
</beans>

创建测试类

package com.aaa.spring.text;

import com.aaa.spring.dao.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Text {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationcontext.xml");(获取主配置文件)
UserService bean = (UserService)context.getBean("userServiceImpl");(获取实现类对象)
bean.deleteUser();
System.out.println("*****************************");
bean.find();
System.out.println("*****************************");
bean.insertUser();
System.out.println("*****************************");
bean.updateUser(); }
}

测试结果

五月 20, 2019 9:01:24 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:01:24 CST 2019]; root of context hierarchy
五月 20, 2019 9:01:24 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
删除用户
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
添加用户
insertUser执行之后记录成功
*****************************
修改用户
updateUser执行之后记录成功 Process finished with exit code 0

前置通知

只需要在LogAdvice 类里边再加方法

package com.aaa.spring.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
}

测试结果

五月 20, 2019 9:08:07 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:08:07 CST 2019]; root of context hierarchy
五月 20, 2019 9:08:08 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser执行之前记录成功
删除用户
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser执行之前记录成功
添加用户
insertUser执行之后记录成功
*****************************
updateUser执行之前记录成功
修改用户
updateUser执行之后记录成功 Process finished with exit code 0

环绕通知

只需要在LogAdvice 类里边再加方法

package com.aaa.spring.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
} }

测试结果

五月 20, 2019 9:10:12 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:10:12 CST 2019]; root of context hierarchy
五月 20, 2019 9:10:12 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser环绕执行前
deleteUser执行之前记录成功
删除用户
deleteUser环绕后执行
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser环绕执行前
insertUser执行之前记录成功
添加用户
insertUser环绕后执行
insertUser执行之后记录成功
*****************************
updateUser环绕执行前
updateUser执行之前记录成功
修改用户
updateUser环绕后执行
updateUser执行之后记录成功 Process finished with exit code 0

最终通知

只需要在LogAdvice 类里边再加方法

package com.aaa.spring.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
}
@After("execution(void *User(..))")
public void after(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"最终执行记录成功");
} }

测试结果

五月 20, 2019 9:12:00 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:12:00 CST 2019]; root of context hierarchy
五月 20, 2019 9:12:00 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser环绕执行前
deleteUser执行之前记录成功
删除用户
deleteUser环绕后执行
deleteUser最终执行记录成功
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser环绕执行前
insertUser执行之前记录成功
添加用户
insertUser环绕后执行
insertUser最终执行记录成功
insertUser执行之后记录成功
*****************************
updateUser环绕执行前
updateUser执行之前记录成功
修改用户
updateUser环绕后执行
updateUser最终执行记录成功
updateUser执行之后记录成功 Process finished with exit code 0

异常通知,这里我们自定义一个异常

先创建一个异常类继承RuntimeException程序异常

package com.aaa.spring.exception;

public class MyException extends  RuntimeException{
public MyException(String yc){
super(yc);
}
}

然后在LogAdvice  类里添加方法这里为了方便测试把上面的都加上了注释

package com.aaa.spring.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
/* @AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
}
@After("execution(void *User(..))")
public void after(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"最终执行记录成功");
}*/
@AfterThrowing(pointcut = "execution(void *User(..))")
public void excaption(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println("执行"+name+"时发生异常");
}
}

然后在实现类里抛出异常

package com.aaa.spring.dao.umpl;

import com.aaa.spring.dao.UserService;
import com.aaa.spring.exception.MyException;
import org.springframework.stereotype.Component; @Component
public class UserServiceImpl implements UserService {
@Override
public void insertUser() {
if(true){
throw new MyException("自定义异常");
}
System.out.println("添加用户");
} @Override
public void updateUser() {
System.out.println("修改用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
} @Override
public void find() {
System.out.println("查询用户");
}
}

测试结果

五月 20, 2019 9:18:57 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:18:57 CST 2019]; root of context hierarchy
五月 20, 2019 9:18:57 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
删除用户
*****************************
查询用户
*****************************
执行insertUser时发生异常
Exception in thread "main" com.aaa.spring.exception.MyException: 自定义异常
at com.aaa.spring.dao.umpl.UserServiceImpl.insertUser(UserServiceImpl.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy7.insertUser(Unknown Source)
at com.aaa.spring.text.Text.main(Text.java:17) Process finished with exit code 1

SpringAOP使用注解实现5种通知类型的更多相关文章

  1. spring aop 的五种通知类型

    本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...

  2. Java开发学习(十六)----AOP切入点表达式及五种通知类型解析

    一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...

  3. spring aop的五种通知类型

    昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...

  4. 黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入

    业务类 package cn.itcast.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoin ...

  5. 跨平台移动开发_PhoneGap 警告,通知,鸣叫,振动4 种通知类型

    创建鸣叫  使用 confirmation.beep 创建鸣叫 function playBeep() {     navigator.notification.beep(1); } 创建振动  使用 ...

  6. AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around

    https://blog.csdn.net/u010502101/article/details/78823056

  7. 十五 Spring的AOP的注解的通知类型,切入点的注解

    Spring的注解的AOP的通知类型 @Before:前置通知 @AfterReturning:后置通知 @Around:环绕通知 @AfterThrowing:异常抛出通知 @After:最终通知 ...

  8. SpringAop@Aspect注解实现切面编程

    SpringAOP在springboot中如何使用 #什么是aop## 概念> aop全称Aspect OrientedProgramming,面向切面,AOP主要实现的目的是针对业务处理过程中 ...

  9. 四种常用的通知类型(xml)

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

随机推荐

  1. day02-操作系统、编程语言分类及python安装

    目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...

  2. linux安装mysql可视化工具MySQL-workbench 连接数据库 执行sql

    Step1:建立数据库连接 点击新建连接的按钮,符号是“+”的按钮,出现下图,在“Connection name”输入连接名称. 填写连接信息 输入数据库连接密码 测试连接: 再次点击连接时会要求输入 ...

  3. ES6学习历程(变量的解构赋值)

    一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1;  b:2;  c:3; let [x, , y] = [1, 2, 3];  x:1   y ...

  4. [C++] 配平化学方程式算法的封装

    有人已经实现了配平的方法,在此不再重复介绍. https://www.cnblogs.com/Elfish/p/7631603.html 但是,上述的方法所提供的代码还是存在着问题,需要进一步修改. ...

  5. 输出n*n矩阵

    int matrix[MAX][MAX]; void PrintMatrix(int x,int y,int start,int n) { ) return ; ) { matrix[x][y] = ...

  6. 7-13 航空公司VIP客户查询 (25 分)

    题意: 思路: 读完题目之后的第一思路就是用map将客户的id(string类型)与里程road(int类型)形成映射,然后直接用id查找添加里程或输出里程.但是400ms的限制妥妥的超时了.然后意识 ...

  7. Linux之iptables(四、网络防火墙及NAT)

    网络防火墙 iptables/netfilter网络防火墙: (1) 充当网关 (2) 使用filter表的FORWARD链 注意的问题: (1) 请求-响应报文均会经由FORWARD链,要注意规则的 ...

  8. 48.cartinality的基本用法

    主要知识点 cartinality的用法     es去重用的是cartinality metric算法,对每个bucket中的指定的field进行去重,然后获取去重后的count,类似于count( ...

  9. Ubuntu | Flask + Gunicorn + Nginx 部署服务器环境

    现在我们手里有一个准备发布的项目,那么如何将他上传到你的服务器,并让外网访问呢? 前提: 1. 安装了Python环境 apt-get install python-dev 2. 安装Flask pi ...

  10. 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser

    [链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...