十三 Spring的通知类型,切入表达式写法
Spring中通知类型:
- 前置通知:目标方法执行之前进行操作,可以获得切入点信息
 - 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值
 - 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方法的执行
 - 异常抛出通知:在程序出现异常的时候进行的操作,可以返回异常信息
 - 最终通知:无论代码是否有异常,总是执行,相当于finally
 - 引介通知(了解即可):
 
切面类:

配置:
测试结果:

环绕通知:目标方法执行之前和之后进行操作(事务管理),可以阻止目标方法的执行




异常抛出通知:程序出现异常的时候进行的操作




最终通知:无论代码是否有异常,总是会执行


引介通知:(了解)
applictionContext.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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置目标对象(被增强对象) -->
<bean id="productDao" class="com.spring4.demo3.ProductDaoImpl"></bean> <!-- 将切面类交给Spring管理 -->
<bean id="myAspect" class="com.spring4.demo3.MyAspectXML"> </bean> <!-- 通过Spring配置对目标类完成代理 -->
<aop:config> <!-- 配置切入点,表达式配置哪些类的哪些方法需要进行增强,*代表任意返回值,...代表任意参数 -->
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.save(..))"
id="pointcut1" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.delete(..))"
id="pointcut2" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.update(..))"
id="pointcut3" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.find(..))"
id="pointcut4" /> <!-- 配置切面 -->
<aop:aspect ref="myAspect"> <!-- 配置前置增强 -->
<aop:before method="checkPri" pointcut-ref="pointcut1" />
<!-- 配置后置增强,设置返回值为result -->
<aop:after-returning method="log4j" pointcut-ref="pointcut2" returning="result" />
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="pointcut3"/>
<!-- 异常抛出通知,设置异常信息为ex -->
<aop:after-throwing method="afterThtowing" pointcut-ref="pointcut4" throwing="ex"/>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="pointcut4"/> </aop:aspect> </aop:config> </beans>
Java
 package com.itheima.spring.demo3;
 public class ProductDaoImpl implements ProductDao {
     @Override
     public void save() {
         System.out.println("保存商品");
     }
     @Override
     public void update() {
         System.out.println("修改商品");
     }
     @Override
     public void find() {
         System.out.println("查找商品");
 //        int i = 1/0;
     }
     @Override
     public String delete() {
         System.out.println("删除商品");
         return "赵洪";
     }
 }
 package com.itheima.spring.demo3;
 import org.aspectj.lang.ProceedingJoinPoint;
 /**
  * 切面:切入点和通知的组合
  * @author 李腾
  */
 public class MyAspectXml {
     /**
      * 前置通知
      * @param joinpoint
      */
     public void checkPri(){
         System.out.println("权限校验=======");
     }
     /**
      * 后置通知
      */
     public void writeLog(Object result){
         System.out.println("日志记录======"+result);
     }
     /**
      * 环绕通知
      * @throws Throwable
      */
     public Object aruond(ProceedingJoinPoint joinPoint) throws Throwable{
         System.out.println("环绕通知=======");
         Object obj = joinPoint.proceed();
         System.out.println("环绕通知=======");
         return obj;
     }
     /**
      * 异常抛出通知
      */
     public void afterThrowing(Throwable ex){
         System.out.println("异常抛出通知"+ex.getMessage());
     }
     /**
      * 最终通知: 相当于finally代码块
      */
     public void after(){
         System.out.println("最终通知=====");
     }
 }
 package com.itheima.spring.demo3;
 import javax.annotation.Resource;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 /**
  *测试类
  */
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration("classpath:applicationContext.xml")
 public class SpringDemo3 {
     @Resource(name="productDao")
     private ProductDao productDao;
     @Test
     public void demo1(){
         productDao.save();
         productDao.update();
         productDao.delete();
         productDao.find();
     }
 }
切入点表达式语法:基于execution函数完成的

十三 Spring的通知类型,切入表达式写法的更多相关文章
- Spring的通知类型,切入表达式写法
		
转载自 https://www.cnblogs.com/ltfxy/p/9882697.html Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方 ...
 - spring quartz  的定时器cronExpression表达式写法(转载)
		
转载来源:https://zhidao.baidu.com/question/240797777248343764.html====================================== ...
 - JAVA框架  Spring AOP--切入点表达式和通知类型
		
一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...
 - 分享知识-快乐自己:Spring切入点的表达式和通知类型
		
1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...
 - 7.Spring切入点的表达式和通知类型
		
1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...
 - Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
		
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
 - Spring AOP使用整理:各种通知类型的介绍
		
2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...
 - spring.net AOP通知类型
		
上篇介绍了spring.net AOP的基本实现,其中有说到通知类型,首先在这里补充解释一下.最后出一个异常通知的实例,因为他的实现和别的通知有些不一样. 1.拦截环绕通知:在Spring中最基础的通 ...
 - spring aop的五种通知类型
		
昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...
 
随机推荐
- 每天进步一点点------SOPC的Avalon-MM IP核(二)  AVALON总线的IP核定制
			
简介 NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求.这节我们就来研究如何定制基于Av ...
 - 查看Mysql数据库版本
			
一.使用终端 1.参数为-V(大写字母)或者--version 使用方法: D:\mysql\bin>mysql -V 或者 D:\mysql\bin>mysql --version
 - phpStudy的虚拟站点域名管理
			
使用phpStudy在本地环境,使用虚拟域名访问本地站点. 步骤: 0x01 修改配置文件 打开站点域名管理 添加你本地站点的路径,第二域名可以不填,网站端口不填的话默认为80. 先点击新增,再点击 ...
 - Aggregate 聚合用法
			
var listb= ListA.Where(x => x.Id.Equals(obj.Id)).Select(x => x.SubData).Aggregate((x, y) => ...
 - oss创建文件夹
			
在进行putObject时,第二个参数写成path/your-object即可
 - HDU 1069 Monkey and Banana(线性DP)
			
Description A group of researchers are designing an experiment to test the IQ of a monkey. They wi ...
 - JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth
			
java8新出的YearMonth可以方便的用来表示某个月.我的项目中使用springmvc来接收YearMonth类型的数据时发现 x-www-from-urlencoded 格式的数据可以使用&q ...
 - 聊聊Redis的持久化
			
两种持久化策略 1.AOF:记录每一次的写操作到日志上,重启时重放日志以重建数据2.RDB:每隔一段时间保存一次当前时间点上的数据快照 快照就是一次又一次地从头开始创造一切3.可以关闭持久化4. ...
 - 洛谷 P1843 奶牛晒衣服(二分答案)
			
嗯... 题目链接:https://www.luogu.com.cn/problem/P1843 我们二分枚举时间,看看那些衣服在蒸发后还要用烘干机,则用cnt记录它的时间. 注意w数组在操作中不能变 ...
 - 安卓之图像视图ImageView
			
一.有关属性说明 (1)scaleType:指定图形的拉伸类型,默认是fitCenter:拉伸类型的取值如下: (2)src:指定图形来源,src图形按照scaleType拉伸:背景图不按scaleT ...