文档章节

Spring框架笔记(二十二)——切点表达式的重用

HappyBKs
 HappyBKs
发布于 2015/07/26 12:48
字数 825
阅读 154
收藏 1

在编写 AspectJ 切面时, 可以直接在通知注解中书写切入点表达式. 但同一个切点表达式可能会在多个通知中重复出现.

在 AspectJ 切面中, 可以通过 @Pointcut 注解将一个切入点声明成简单的方法. 切入点的方法体通常是空的, 因为将切入点定义与应用程序逻辑混在一起是不合理的. 

切入点方法的访问控制符同时也控制着这个切入点的可见性. 如果切入点要在多个切面中共用, 最好将它们集中在一个公共的类中. 在这种情况下, 它们必须被声明为 public. 在引入这个切入点时, 必须将类名也包括在内. 如果类没有与这个切面放在同一个包中, 还必须包含包名.

其他通知可以通过方法名称引入该切入点.


好吧,我们之前提过连接点、切点的定义。现在还能分清吗?如果这里需要做个分辨,那么你可以将切点理解为切点表达式,连接点为各个通知的JointPoint参数。

我们看两个切面的定义,其中一个切面的类方法中有一个方法用于声明切点表达式,这样该切点类的其他通知都可以使用这个方法来注解各个通知的切点表达式;其他切点的通知也可以只用,但要写清类名。

package com.happBKs.spring.aopbasic.aop1;

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

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(Integer.MAX_VALUE)
@Aspect
@Component
public class DataValidateAspect {
	

	/*
	 * 定义一个方法用于声明切点表达式。一般的,该方法中再也不需要添加其他代码
	 * 使用@Pointcut注解声明切点表达式
	 */
	@Pointcut("execution(public int com.happBKs.spring.aopbasic.aop1.AtithmeticCalculate.*(..))")
	public void declarePointCut(){}
	
	@Before("declarePointCut()")
	public boolean beforeMethod(JoinPoint joinPoint)
	{
		String methodName=joinPoint.getSignature().getName();
		List<Object> args=Arrays.asList(joinPoint.getArgs());
		System.out.println("data validate---begin to "+methodName+" with "+args);
		if((Integer)(args.get(0))>0&&(Integer)(args.get(1))>0)
		{
			System.out.println("data is OK");
			return true;
		}
		else
		{
			System.out.println("data is bad");
			return false;
		}
		
	}

}
package com.happBKs.spring.aopbasic.aop1;

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

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class DataValidateAspect2 {
	

	@Before("com.happBKs.spring.aopbasic.aop1.DataValidateAspect.declarePointCut()")
	public boolean beforeMethod(JoinPoint joinPoint)
	{
		String methodName=joinPoint.getSignature().getName();
		List<Object> args=Arrays.asList(joinPoint.getArgs());
		System.out.println("data validate 2---begin to "+methodName+" with "+args);
		if((Integer)(args.get(0))<10000&&(Integer)(args.get(1))<10000)
		{
			System.out.println("data is OK");
			return true;
		}
		else
		{
			System.out.println("data is bad");
			return false;
		}
		
	}
	
}

配置文件:

<?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>

测试代码:

@Test
	public void testSpringAOP()
	{
		//1. 创建spring 的 IOC 容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		//2. 从IOC容器获取bean实例
		AtithmeticCalculate atithmeticCalculate = (AtithmeticCalculate)ac.getBean(AtithmeticCalculate.class);
		//考察一下代理对象是否生成
		System.out.println(atithmeticCalculate.getClass().getName());
		//3. 使用bean
		System.out.println("Example 1:");
		int result=atithmeticCalculate.add(10, 5);
		System.out.println(result);
//		System.out.println("\r\nExample 2:");
//		int result2=atithmeticCalculate.div(10, 0);
//		System.out.println(result2);
	}

输出结果:

com.sun.proxy.$Proxy10

Example 1:

data validate---begin to add with [10, 5]

data is OK

data validate 2---begin to add with [10, 5]

data is OK

15



© 著作权归作者所有

HappyBKs

HappyBKs

粉丝 665
博文 306
码字总数 481268
作品 0
浦东
程序员
私信 提问
Spring中的AOP(六)——定义切入点和切入点指示符

定义切入点 在前文(点击查看)中使用到的AdviceTest类中同一个切点(即* com.abc.service..advice(..)匹配的连接点)却重复定义了多次,这显然不符合软件设计的原则,为了解决这个问题,Asp...

摆渡者
2014/03/23
7.7K
3
Spring学习总结——Spring实现AOP的多种方式

Spring学习总结——Spring实现AOP的多种方式 AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术。AOP是OOP的补充...

the_flying_pig
2017/11/06
0
0
Spring(四):面向切面编程AOP

横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通用功能,但是可以通过声明的方式定义这个功能以何种方式在何...

_Roger_
2015/09/09
454
0
Spring中的AOP(七)——基于XML配置文件方式的AOP

除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们。在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2.X后提供了一...

摆渡者
2014/03/24
4.4K
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
2018/08/19
105
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx访问日志/日志切割/静态文件过期时间/防盗链

Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。 nginx主配置文件:/etc/nginx/nginx.conf 查看nginx主配置文件: ```markup [root@linux ~]# cat /e...

asnfuy
27分钟前
8
0
JS_高程4.变量,作用域和内存问题(2)执行环境及作用域

本文转载于:专业的前端网站➨JS_高程4.变量,作用域和内存问题(2)执行环境及作用域 1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,       每个执...

前端老手
31分钟前
5
0
手机迅雷下载的文件,电脑上找不到问题

不知道手机迅雷怎么做到的,手机迅雷下载的文件,手机上可以看的到 但连电脑后, 电脑上看不到文件 . 尝试了打开查看隐藏文件, 但没有效果 . 手机上查询文件权限 也是对的 . 可读,可写, 不隐藏 ...

ol_O_O_lo
33分钟前
5
0
python学习11:Python tuple元组详解

元组是 Python 中另一个重要的序列结构,和列表类似,也是由一系列按特定顺序排序的元素组成。和列表不同的是,列表可以任意操作元素,是可变序列;而元组是不可变序列,即元组中的元素不可以...

太空堡垒185
45分钟前
5
0
Java实现数据结构之线性结构

一、顺序表 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。 下面是我自己使用java实现的简单顺序表结构 package list; public class MyArrayList<E> { ...

daxiongdi
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部