Aspect 分析记录

记录对于Aspect的一些自己的理解和认知。

/**
 * 日志的AOP实现
 * 
 * @author scott.lee
 * 
 */
@Component
@Aspect
public class LogAopAchieve {
	private static final long serialVersionUID = 1L;
	private static final Logger LOG = Logger.getLogger(LogAopAchieve.class);

	// 所有在com.yoouce.ycecs下的类
	@Before("execution(* com.yoouce.ycecs.*.*(..))")
	public void doBefore(JoinPoint jp) {
		LOG.info("log Begining method: " + jp.getTarget().getClass().getName()
				+ "." + jp.getSignature().getName());
	}

	// 方法执行后调用
	@After("execution(* com.yoouce.ycecs.*.*(..))")
	public void doAfter(JoinPoint jp) {
		LOG.info("log Ending method: " + jp.getTarget().getClass().getName()
				+ "." + jp.getSignature().getName());
	}

	// 方法执行的前后调用
	@Around("execution(* com.yoouce.ycecs.*.*(..))")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
		long time = System.currentTimeMillis();
		Object retVal = pjp.proceed();
		time = System.currentTimeMillis() - time;
		LOG.info("process time: " + time + " ms");
		return retVal;
	}

	// 方法运行出现异常时调用
	@AfterThrowing("execution(* com.yoouce.ycecs.*.*(..))")
	public void doThrowing(JoinPoint jp, Throwable ex) {
		LOG.info("method " + jp.getTarget().getClass().getName() + "."
				+ jp.getSignature().getName() + " throw exception");
		LOG.info(ex.getMessage());
	}
}

 execution 用于匹配方法执行的连接点;

within 用于匹配指定类型内的方法执行;

this 用于匹配当前 AOP 代理对象类型的执行方法; 注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
 
target 用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;

args 用于匹配当前执行的方法传入的参数为指定类型的执行方法;

@within 用于匹配所以持有指定注解类型内的方法;

@target 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;

@args 用于匹配当前执行的方法传入的参数持有指定注解的执行;

@annotation 用于匹配当前执行方法持有指定注解的方法;

bean Spring AOP扩展的, AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;

reference pointcut: 表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。

配置文件如下

<!--aspect AOP切面配置 -->
	<aop:config proxy-target-class="true" />
	<aop:config>
		<aop:aspect id="LogAopAchieve" ref="aspectBean">
			<!--配置com.spring.service包下所有类或接口的所有方法 -->
			<aop:pointcut expression="execution(* com.yoouce.ycecs..*.*(..))"
				id="logPointCut" />
			<aop:before method="doBefore" pointcut-ref="logPointCut" />
			<aop:after method="doAfter" pointcut-ref="logPointCut" />
			<aop:around method="doAround" pointcut-ref="logPointCut" />
			<aop:after-throwing method="doThrowing" throwing="ex"
				pointcut-ref="logPointCut" />
		</aop:aspect>
	</aop:config>

	<bean id="aspectBean" class="com.yoouce.yclab.aop.LogAopAchieve" />

pointcut基于正则的语法,也支持通配符,含义如下:

* 表示任何数量的字符,除了(.)
.. 表示任何数量的字符包括任何数量的(.)
+ 描述指定类型的任何子类或者子接口
同java一样,提供了一元和二元的条件表达操作符。
一元操作符:!
二元操作符:||和&&
优先权同java

猜你喜欢

转载自oncekey.iteye.com/blog/2233910