`

征服Spring AOP—— @AspectJ

阅读更多
接N年前写的一篇Spring AOP相关的内容征服Spring AOP—— Schema,沿用原有例子,将Schema方式转换为@AspectJ方式实现。
注解方式的确更加简洁,由配置优先转为契约优先,还是需要点过程,至少是理解上和心理上!



相关内容:
征服Spring AOP—— Schema
征服Spring AOP—— @AspectJ



先看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"
	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"
>
	<!-- proxy-target-class默认"false",更改为"ture"使用CGLib动态代理 -->
	<aop:aspectj-autoproxy proxy-target-class="true" />
	<bean
		id="hello"
		class="org.zlex.aop.SayHello" />
	<bean class="org.zlex.aop.AspectJAdvice" />
</beans>


<aop:aspectj-autoproxy />打开自动代理,proxy-target-class默认"false"使用JDK代理,更改为"ture"使用CGLib动态代理。
org.zlex.aop.AspectJAdvice是在上一篇Advice类的AspectJ注解实现。
逐步解析。。。
@Aspect标注AspectJ的实现类:
@Aspect
public class AspectJAdvice {
// ...
}

先来看BeforeAdvice,实现方法如下:
	/**
	 * @param joinPoint
	 */
	@Before("execution(* org.zlex.aop.Hello.sayHelloBefore(..))")
	public void beforeAdvice(JoinPoint joinPoint) {
		System.out.println("Before: " + joinPoint.getSignature().getName());
	}

@Before("execution(* org.zlex.aop.Hello.sayHelloBefore(..))")也可以写成@Before(value="execution(* org.zlex.aop.Hello.sayHelloBefore(..))")
当执行org.zlex.aop.Hello.sayHelloBefore(..)方法时,将触发beforeAdvice方法。

AfterAdvice和AroundAdvice与之类似,代码如下:
	/**
	 * After
	 * 
	 * @param joinPoint
	 */
	@After(value = "execution(* org.zlex.aop.Hello.sayHelloAfter(..))")
	public void afterAdvice(JoinPoint joinPoint) {
		System.out.println("After: " + joinPoint.getSignature().getName());
	}

	/**
	 * Around
	 * 
	 * @param joinPoint
	 * @return
	 * @throws Throwable
	 */
	@Around(value = "execution(* org.zlex.aop.Hello.sayHelloAround(..))")
	public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("Around: " + joinPoint.getSignature().getName());
		System.out.println("Before");
		Object obj = joinPoint.proceed();
		System.out.println("End");
		return obj;
	}

只是这里的AroundAdvice在实现方法时,需要ProceedingJoinPoint作为参数,用于执行环绕方法,并将执行结果返回。

AfterReturningAdvice可以获取目标方法的返回值,代码如下:
	/**
	 * AfterReturning
	 * 
	 * @param joinPoint
	 */
	@AfterReturning(value = "execution(* org.zlex.aop.Hello.sayHelloAfterReturning(..))", returning = "retVal")
	public void afterReturningAdvice(JoinPoint joinPoint, String retVal) {
		System.out.println("AfterReturning: "
				+ joinPoint.getSignature().getName());
		System.out.println("Return Value: " + retVal);
	}

@AfterReturning(value = "execution(* org.zlex.aop.Hello.sayHelloAfterReturning(..))", returning = "retVal")中,有一个注解参数returning用于标识返回值参数,与方法中的参数名称保持一致即可。

AfterThrowingAdvice与AfterReturningAdvice类似,可以获得目标对象抛出的异常,代码如下:
	/**
	 * AfterThrowing
	 * 
	 * @param joinPoint
	 */
	@AfterThrowing(value = "execution(* org.zlex.aop.Hello.sayHelloAfterThrowing(..))", throwing = "e")
	public void afterThrowingAdvice(JoinPoint joinPoint, Exception e) {
		System.out.println("AfterThrowing: "
				+ joinPoint.getSignature().getName());
		System.out.println("Exception Message: " + e.getMessage());
	}


这里需要着重说明的是Introduction的注解实现方式,代码如下:
	@DeclareParents(value = "org.zlex.aop.SayHello", defaultImpl = org.zlex.aop.IntroductionOk.class)
	public Ok ok;

这里的Ok接口,用来扩展原有SayHello。这个成员变量(ok)必须标示为public,即public Ok ok;
@DeclareParents参数中,defaultImpl指向Ok接口的实现类,value标识目标类。比起Schema的繁杂配置,可谓是一步到位! 

这里就不再废话了,代码相见附件



相关内容:
征服Spring AOP—— Schema
征服Spring AOP—— @AspectJ

分享到:
评论
2 楼 慕何而来 2012-05-29  
snowolf 写道
为啥上传的附件看不到了呢?!很诡异!

有的啊
1 楼 snowolf 2012-04-10  
为啥上传的附件看不到了呢?!很诡异!

相关推荐

    Spring AOP @AspectJ 入门实例

    本实例将带你深入理解并实践Spring AOP与@AspectJ的结合使用。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,即跨越多个对象的行为或责任。这些切面可以包含业务逻辑、日志、...

    Spring AOP 概念理解及@AspectJ支持

    **Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。

    @AspectJ配置Spring AOP,demo

    **Spring AOP与@AspectJ配置详解** Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它提供了一种模块化和声明式的方式来处理应用程序中的横切关注点,如日志、事务管理等。在传统的面向对象编程中,...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    Spring的AOP实例(XML+@AspectJ双版本解析+源码+类库)

    **Spring的AOP实例——XML与@AspectJ双版本解析** Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统的交叉关注点,如日志、事务管理等。AOP的核心概念包括切面...

    Spring @AspectJ 实现AOP 入门例子

    本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...

    Spring boot——@DeclareParents例子

    在Spring Boot框架中,`@DeclareParents`注解是AOP(面向切面编程)的一部分,主要用于实现动态代理。AOP允许我们在不修改原有代码的情况下,通过“切面”来增强或修改程序的行为,这对于日志记录、事务管理等横切...

    spring对AOP的支持(使用AspectJ进行AOP演示)

    Spring 提供了两种主要的 AOP 实现方式:基于代理的和基于 AspectJ 的。基于代理的方式是 Spring 默认的实现,它通过 JdkDynamicProxy 或 CGLIB 创建代理对象来实现切面。而基于 AspectJ 的方式则更为强大,它允许...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    因Spring AOP导致@Autowired依赖注入失败的解决方法

    Spring AOP 导致@Autowired 依赖注入失败的...Spring AOP 导致@Autowired 依赖注入失败的解决方法有两种:将方法修饰符改为 public 和使用 AspectJ 进行注入。希望本文的内容能够对大家的学习或者工作带来一定的帮助。

    【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within

    上文我们已讲完五种通知Advice注解,所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@...

    Spring AOP的AspectJ支持jar包

    Spring AOP的AspectJ支持jar包; 包括: com.springsource.net.sf.cglib-2.2.0.jar com.srpingsource.org.aopalliance-1.0.0.jar com.srpingsource.org.aspectj.weaver-1.68.RELEASE.jar

    Spring AOP之基于AspectJ注解总结与案例

    本篇内容将对Spring AOP中基于AspectJ注解的使用进行总结,并通过实际案例进行解析。 首先,让我们理解AspectJ注解在Spring AOP中的核心概念: 1. **@Aspect**: 这个注解用于定义一个类为切面,这个类将包含切点和...

    Spring AOP + AspectJ annotation example

    AspectJ是Spring AOP支持的一种强大的、独立的AOP语言,它提供了注解来简化切面的定义。本篇将深入探讨如何结合Spring AOP和AspectJ注解进行实践。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,...

Global site tag (gtag.js) - Google Analytics