文档章节

Spring框架笔记(十八)——AspectJ后置通知

HappyBKs
 HappyBKs
发布于 2015/07/25 16:50
字数 614
阅读 155
收藏 1

AspectJ 支持 5 种类型的通知注解: 

@Before : 前置通知, 在方法执行之前执行

@After : 后置通知, 在方法执行之后执行 

@AfterRunning: 返回通知, 在方法返回结果之后执行

@AfterThrowing: 异常通知, 在方法抛出异常之后

@Around : 环绕通知, 围绕着方法执行


后置通知

后置通知是在连接点完成之后执行的, 即连接点返回结果或者抛出异常的时候, 下面的后置通知记录了方法的终止. 

一个切面可以包括一个或者多个通知.

我们在上一篇前置通知所在切面类的基础上加入一个后置通知:

package com.happBKs.spring.aopbasic.aop1;

import java.util.Arrays;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//把这个类声明为一个切面:需要把该类放入得到IOC容器中(使用注解@Component),在声明为一个切面(使用注解@Aspect)
@Aspect
@Component
public class LoggingAspect {
	
	//需要告诉这个方法需要在哪些类的哪些方法开始之前执行,所以加一个注解@before,作为前置通知
	//声明该方法是一个前置通知:在目标方法之前执行
	@Before("execution(public int com.happBKs.spring.aopbasic.aop1.AtithmeticCalculate.*(int, int))")
	public void beforeMethod(JoinPoint joinPoint)
	{
		String methodName=joinPoint.getSignature().getName();
		List<Object> args=Arrays.asList(joinPoint.getArgs());
		System.out.println("begin to "+methodName+" with "+args);
	}
	

	
	//后置通知:在目标方法执行之后(无论是否发生异常),执行该通知
	//在后置通知中还不能访问目标方法执行的结果。执行结果可以在返回通知中访问。
	@After("execution(public int com.happBKs.spring.aopbasic.aop1.AtithmeticCalculate.*(int, int))")
	public void afterMethod(JoinPoint joinPoint)
	{
		String methodName=joinPoint.getSignature().getName();
		System.out.println("end to "+methodName);
	}
	
}


spring配置文件:

<?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"
	xmlns:context="http://www.springframework.org/schema/context"
	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-4.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

	<context:component-scan base-package="com.happBKs.spring.aopbasic.aop1"></context:component-scan>
	
	<!-- 使用AspectJ注解起作用。自动为匹配的类生成代理对象  -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

测试程序:

package com.happBKs.spring.aopbasic;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.happBKs.spring.aopbasic.aop1.AtithmeticCalculate;

public class TestSpringAOP {
	@Test
	public void testSpringAOP()
	{
		//1. 创建spring 的 IOC 容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		//2. 从IOC容器获取bean实例
		AtithmeticCalculate atithmeticCalculate = (AtithmeticCalculate)ac.getBean(AtithmeticCalculate.class);
		//3. 使用bean
		int result=atithmeticCalculate.add(10, 5);
		System.out.println(result);
		int result2=atithmeticCalculate.sub(10, 5);
		System.out.println(result2);
	}
}

输出结果:

begin to add with [10, 5]

end to add

15

begin to sub with [10, 5]

end to sub

5


© 著作权归作者所有

HappyBKs

HappyBKs

粉丝 665
博文 306
码字总数 481268
作品 0
浦东
程序员
私信 提问
spring基础知识---AOP介绍和实现

Spring Boot实践——AOP实现 spring aop两种配置方式 借鉴:http://www.cnblogs.com/xrq730/p/4919025.html    https://blog.csdn.net/zhaokejin521/article/details/50144753     http......

spinachgit
02/21
8
0
2014-03-11 Spring的学习(3)------面向切面编程(AOP)

AOP概念 首先让我们从一些重要的AOP概念和术语开始。这些术语不是Spring特有的。不过AOP术语并不是特别的直观,如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect):一个关注...

查封炉台
2014/03/11
395
0
day33_Spring学习笔记_02

一、AOP 1.1、AOP介绍 1.1.1、什么是AOP? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:,通过和实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开...

黑泽明军
2018/08/03
0
0
Spring 的 AOP 的支持

面向切面编程(Aspect-oriented Programming,AOP)通过提供另一种思考程序结构的方法来补充面向对象编程(Object-oriented Programming,OOP)。OOP中模块化的关键单元是类,而AOP中模块化的单元是...

非摩尔根
2018/12/18
52
0
Spring 2.0 的AOP介绍及其通知类型

Spring 2.0的AOP 在Spring 2.0中最激动人心的增强之一是关于Spring AOP,它变得更加便于使用而且更加强大,主要是通过复杂而成熟的AspectJ语言的支持功能来实现,而同时保留纯的基于代理的J...

小星星程序员
2014/08/15
290
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部