spring aop的五大通知类

spring aop的五大通知类spring aop的五大通知类

大家好,又见面了,我是你们的朋友全栈君。

spring aop通知(advice)分成五类:

  • 前置通知[Before advice]@Before:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
  • 后置通知、正常返回通知[After returning advice]@AfterReturning:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行;与环绕通知同时使用时,会受环绕通知的影响
  • 异常通知、异常返回通知[After throwing advice]@AfterThrowing:在连接点抛出异常后执行。
  • 最终通知、返回通知[After (finally) advice]@After:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
  • 环绕通知[Around advice]@Around:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
    在这里插入图片描述
    pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>dome03</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
</dependencies>
</project>

applicationContext.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<context:component-scan base-package="com.xbj"/>
<aop:config proxy-target-class="true">
<aop:aspect ref="myAdvices">
<aop:pointcut id="pc" expression="execution(* com.xbj.service.impl.*.*(..))"/>
<aop:before method="before" pointcut-ref="pc" />
<aop:after-returning method="afterRunturn" pointcut-ref="pc" />
<aop:after method="afterfinally" pointcut-ref="pc" />
<aop:around method="around" pointcut-ref="pc" />
<!--ex 要和 切面的 参数签名一致-->
<aop:after-throwing method="afterThorw" pointcut-ref="pc" throwing="ex" />
</aop:aspect>
</aop:config>
</beans>

UserController.java

package com.xbj.controller;
import com.xbj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
/* @Controller @Repository @Component @Service 都是将bean放入Ioc容器中,只是为了代码的可读性而去区别开 * @Autowired 是从Ioc容器拿对象 * */
@Controller
public class UserController { 

@Autowired
private UserService userService;
public void addUser(){ 

userService.addUser();
}
}

UserDao.java

package com.xbj.dao;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
public interface UserDao { 

void addUser();
void delUser();
}

UserDaoImpl.java

package com.xbj.dao.impl;
import com.xbj.dao.UserDao;
import org.junit.runner.RunWith;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@Repository
public class UserDaoImpl implements UserDao { 

public void addUser() { 

System.out.println("addUser");
}
public void delUser() { 

System.out.println("delUser");
}
//定义初始化方法
public void myInit(){ 

System.out.println("init...");
}
//定义销毁方法
public void dest(){ 

System.out.println("dest...");
}
}

UserService.java

package com.xbj.service;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
public interface UserService { 

void addUser();
void delUser();
}

UserServiceImpl.java

package com.xbj.service.impl;
import com.xbj.dao.UserDao;
import com.xbj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@Service
public class UserServiceImpl implements UserService { 

@Autowired
private UserDao userDao;
public void addUser() { 

userDao.addUser();
}
public void delUser() { 

userDao.delUser();
}
}

MyAdvices.java

package com.xbj;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
/* * 注意类的包名 * */
@Component
public class MyAdvices { 

//前置通知
public void before(JoinPoint joinpoint){ 

System.out.println("前置通知");
}
//正常放回通知
public void afterRunturn(JoinPoint joinpoint){ 

System.out.println("afterRunturn");
}
//最终返回通知
public void afterfinally(JoinPoint joinpoint){ 

System.out.println("afterfinally");
}
//环绕通知
public void around(ProceedingJoinPoint proceedingJoinPoint){ 

System.out.println("around-before");
try { 

proceedingJoinPoint.proceed();
} catch (Throwable throwable) { 

throwable.printStackTrace();
}
System.out.println("around-after");
}
//异常通知
public void afterThorw(Throwable ex){ 

System.out.println("afterThorw"+ex);
}
}

test.java


import com.xbj.controller.UserController;
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;
/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 
"classpath:applicationContext.xml"})
public class test { 

@Autowired
private UserController controller;
@Test
public void t1() { 

controller.addUser();
}
}

控制台输出:

前置通知
around-before
addUser
around-after
afterfinally
afterRunturn
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106637.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • OpenCv中 width 和 widthStep的区别「建议收藏」

    OpenCv中 width 和 widthStep的区别「建议收藏」前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。

  • 系统安装失败如何恢复原系统_安装失败显示其他原因

    系统安装失败如何恢复原系统_安装失败显示其他原因按照博客上的方法安装了npm,但是安装cnpm出现了“cnpm不是内部命令”那么我就详细的来说下解决方法;1,node.js的安装在node.js官网下载,根据你电脑的选择版本,我的安装路径是D盘,D:\ProgramFiles\nodejs输入npm-v检测是否安装成功。2.安装cnpmnpminstall-gcnpm–registry=https://registry.npm.taobao.org(注意要对环境变量配置)在系统变量path下添加该路径D:\Prog

    2022年10月15日
  • 2005中文博客排名报告「建议收藏」

    2005中文博客排名报告「建议收藏」2005中文博客排名报告发布机构:时代财富科技公司 摘要:2004年11月时代财富科技公司推出了中文Blog排行榜,得到了大众及媒介的广泛关注,也成为众多同行和资本市场了解中文博客网站的重要参考。历经2005年上半年中文Blog托管网站的飞速发展时期,博客网站也正经历着重新的洗牌和残酷的市场竞争。经过长时间的调查和分析,结合大量的用户体验,时代财富科技公司于2005年8月隆重推出《

  • 基于MeanShift的目标跟踪算法及实现

    基于MeanShift的目标跟踪算法及实现这次将介绍基于MeanShift的目标跟踪算法,首先谈谈简介,然后给出算法实现流程,最后实现了一个单目标跟踪的MeanShift算法【matlab/c两个版本】 一、简介    首先扯扯无参密度估计理论,无参密度估计也叫做非参数估计,属于数理统计的一个分支,和参数密度估计共同构成了概率密度估计方法。参数密度估计方法要求特征空间服从一个已知的概率密度函数,在实际的应用中这个条件很难达到

  • 人体检测–热释电传感器开发

    人体检测–热释电传感器开发人体检测–热释电传感器开发人体热释电传感器顾名思义是探测是否有人体通行和通过,由于它的廉价性,使得它的应用范围非常广泛。楼道里的灯,天台的报警设施等,都是利用这个来进行报警和检测。本文章将分为两个板块来介绍传感器的开发和应用。一·热释电传感器的工作原理  某些晶体,例如钽酸锂、硫酸三甘肽等受热时,晶体两端会产生数量相等、符号相反的电荷。1842年布鲁斯特将这种由温度变化引起的电极化现象正式命名为…

  • java和c 就业,c++和java的区别和就业前景

    java和c 就业,c++和java的区别和就业前景c++和java都是当下最热门的编程语言,二者各有各的优势。java与c++都是面向对象的语言,但java晚于c++发布,部分语法和思想也参考了c++,只是java没有头文件、指针、运算符重载、虚基类等等,算是c++语言的“纯净版”。c++和java的主要区别1、指针java语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号