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. NSOperationQueue和GCD的区别,以及在什么场合下使用

    1> GCD是纯C语言的API .NSOperationQueue是基于GCD的OC的封装. 2> GCD只支持FIFO队列,NSOperationQueue可以方便设置执行顺序,设置最大 ...

  2. PHP 之CURL请求封装GET、POST、PUT、DELETE

    /** * @Description: curl请求 * @Author: Yang * @param $url * @param null $data * @param string $method ...

  3. 点击 table 单元格 取值

    function Test() { var rows = document.getElementById("tbDetail").rows; if (rows.length > ...

  4. Tomcat启动失败--Several ports (8005, 8080, 8009)

    启动Tomcat服务器报错: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are alre ...

  5. rsync全网备份

    rsync备份企业方案 企业有Linux服务器又有windows服务器,备份用rsync(服务端),Linux(客户端),Windows(客户端,cwrsync,旧版本有免费版)打包压缩数据往服务器上 ...

  6. The Forth Week

    1.复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. cp -r /etc/skell /home/tuser1 ; ...

  7. Git:文件操作和历史回退

    目录 创建仓库 创建文件/文件夹 修改文件/文件夹 回到修改前的版本 撤销修改 删除文件 工作区.暂存区.版本区 创建仓库 创建新文件夹:mkdir learngit 进入:cd learngit l ...

  8. BUPT2017 springtraining(16) #2 ——基础数据结构

    题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ] ...

  9. Maven学习总结(27)——Maven自定义打包插件maven-assembly-plugin详解

    Assembly插件会生成 "assemblies", 此特性等同于的Maven 1 distribution plug-in..该插件不仅支持创建二进制归档文件,也支持创建源码归 ...

  10. Vim+xxd=强大的十六进制编辑器

    Vim 是黑客文化中强大的编辑器.利用它调用外部十六进制文件显示命令xxd就可以顺利的编辑二进制文件了. 其中,%在vimComandLine时代表当前文件的路径,xxd是以十六进制显示一个文件,xx ...