

除了这五种还有一种特殊的通知


看一下前四种通知所产生的时机和使用方法
回到工程,额外增加方法

将其进行配置

![]()
前置通知
![]()
后置通知
![]()
分别对应了执行前和执行后
后置通知有一个问题无法获取到在目标方法运行过程中产生的返回值或者是抛出的异常,这时就需要使用返回后通知,以及异常通知来进行处理了
返回后通知用于接收目标方法所产生的返回值

返回后通知的 配置方式也有些不一样
![]()
没有返回值的方法返回的是


返回的是一个字符串

接收到返回的字符串并打印了出来

返回后通知可以接收目标方法的返回值
实现触发后置通知在触发返回后通知

这两个的前后顺序是由我们 配置的前后顺序所决定的

改变顺序后运行一下

最后一种通知异常通知顾名思义 程序出现异常时抛出的通知

![]()
是所有异常的父类,放在这里是为了捕获目标方法所抛出的异常

配置
![]()
为了触发异常通知我们回到方法上,模拟一个在实际工作中会出现的异常

输出报错
输出顺序与配置顺序保持一致,讲到这里四种通知的类型进行了一一的演示,虽然不常用但在面试笔试时会经常用到

实际工作中不断的数据累积用户量增大,可能会导致生产环境中系统越来越慢,那么如何定义到哪一个方法慢呢?
aop可以非常好的解决这个问题,只需要方法执行前捕捉方法的开始时间,和执行后方法的结束时间两者一相减就可以知道,如果其执行时间超过了规定范围就将它输出保存在日志里面。
使用aop5种通知的前置通知还是后置通知呢?,其实都不行因为既要在运行前保存一个时间,也要在运行后保存一个时间,这肯定是单个通知难以做到的。我们可以利用环绕通知控制目标方法完整的运行周期
实例讲解

在每一个方法上进行时间的检查,如果单个方法执行时间超过一秒就认为他太慢需要优化,
设置依赖

新建applicationContext文件,定义bean

下面进入到切面编程

新建类代表方法检查器,用于监控方法的执行效率
环绕通知要使用![]()

![]()

这个object对象本质就是目标方法执行后的返回值
proceed会返回一个object对象,object本质是目标方法的返回值,所以在最后还需要将其返回

作为环绕通知,通常只会去捕获对应异常的产生,作为产生的异常大多会向外抛出去,为什么要抛出去呢?原因很简单因为在我们系统中未来运行可能不止有一个通知,在环绕通知中对这个异常进行了消化就意味着,其他后续的处理都不会捕捉到这个异常,就会产生一些意料之外的问题,所以直接利throw抛出去。加入自己的异常处理代码。
进行配置

初始ioc容器

为了能触发环绕通知


这样就可以知道时间进行优化了

答案
-
"bookShop" class="com.imooc.spring.aop.sell.BookShop"> - <bean id="methodPro" class="com.imooc.spring.aop.aspect.MethodPro">bean>
- <aop:config >
- <aop:pointcut id="pointcut" expression="execution(* com.imooc..*.*(..))"/>
- <aop:aspect ref="methodPro">
- <aop:around method="welcome" pointcut-ref="pointcut">aop:around>
- aop:aspect>
- aop:config>
-
- public class MethodPro {
- public Object welcome(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("欢迎光临科科小店");
- Object ret = pjp.proceed();
- String className = pjp.getTarget().getClass().getName();
- String methodName = pjp.getSignature().getName();
- System.out.println("欢迎再次光临");
- return ret;
- }
- }
- public class BookShop {
- public void sellingBooks(){
- System.out.println("卖出一本武林外传");
- }
- }
- public class SpringApplication {
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
- BookShop bookShop = context.getBean("bookShop", BookShop.class);
- bookShop.sellingBooks();
-
- }
- }