Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.
一:使用AspectJ注解:
1,启用对AspectJ的支持:
通过在Spring的配置中引入下列元素来启用Spring对AspectJ的支持:
<aop:aspectj-autoproxy />
或者(如果不是使用XSD的话)
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
2,声明一个带有@Aspect注解的类,在这个类中声明那些方法需要被'关注'(利用@Pointcut),在那些时机点进行关注(利用@Before,@AfterReturning等等...),执行'切入'的方法
3,在Spring的配置文件中定义这个'切面'类:任意带有一个@Aspect切面(拥有@Aspect注解)的bean都将被Spring自动识别并用于配置在Spring AOP.
4,使用被Spring管理的bean,在执行被'关注'的方法时,'切入'的方法就会被执行.
一个完整的例子:
需要被'切入'的类:

 public class Monkey {
public void stealPeaches(String name) {
System.out.println(" Monkey " + name + " is stealling peaches...");
} public void stealCorns(String name) {
System.out.println(" Monkey " + name + " is stealling corns...");
}
}
切面类
1 @Aspect
public class Guardian {
@Pointcut("execution(* com.test.spring.aspectj.Monkey.stealPeaches(..))")
public void guardOrchard() {
} @Before(value = "guardOrchard()")
public void guardOrchardBefore() {
System.out.println("Guardian spotted a monkey is approaching the orchard...");
} @AfterReturning("guardOrchard() && args(name,..)")
public void guardOrchardAfter(String name) {
System.out.println("Guardian caught a monkey stealling peaches whoes name is " + name + "...");
}
@Around("guardOrchard() && args(name,..)")
public void guardOrchardAround(ProceedingJoinPoint joinpoint,String name) {
System.out.println("Guardian guardOrchardAround started ... " + name);
try {
joinpoint.proceed();
} catch (Throwable e) {
System.out.println("Guardian guardOrchardAround exception happened ... " + name);
}
System.out.println("Guardian guardOrchardAround completed ... " + name);
}
@Pointcut("execution(* com.test.spring.aspectj.Monkey.stealCorns(..))")
public void guardFarm() {
} @Before(value = "guardFarm()")
public void guardFarmBefore() {
System.out.println("Guardian spotted a monkey is approaching the farm...");
} @AfterReturning("guardFarm() && args(name,..)")
public void guardFarmAfter(String name) {
System.out.println("Guardian caught a monkey stealling corns whoes name is " + name + "...");
}
}

配置文件

 <?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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!--
<aop:aspectj-autoproxy /> equals to <bean
class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"
/>
-->
<aop:aspectj-autoproxy />
<bean id="guardian" class="com.test.spring.aspectj.Guardian" /> <bean id="monkey" class="com.test.spring.aspectj.Monkey" /> </beans>

使用bean

 ApplicationContext context = new ClassPathXmlApplicationContext("conf/aspectJAppcontext.xml");
Monkey monkey = (Monkey) context.getBean("monkey");
try {
monkey.stealPeaches("mighty monkey");
monkey.stealCorns("mighty monkey");
} catch (Exception e) {
}

运行结果

 Guardian spotted a monkey is approaching the orchard...
Guardian guardOrchardAround started ... mighty monkey
Monkey mighty monkey is stealling peaches...
Guardian caught a monkey stealling peaches whoes name is mighty monkey...
Guardian guardOrchardAround completed ... mighty monkey
Guardian spotted a monkey is approaching the farm...
Monkey mighty monkey is stealling corns...
Guardian caught a monkey stealling corns whoes name is mighty monkey...

二:通过XML配置AspectJ实现AOP:在java类中定义要被'方面'调用的切入方法,在XML中配置.
例子:被'切入'的类,普通java类:

 public class Monkey {
public void stealPeaches(String name) {
System.out.println(" Monkey " + name + " is stealling peaches...");
} public void stealCorns(String name,int numberToSteal) {
System.out.println(" Monkey " + name + " is stealling corns...");
}
}

定义要被'方面'调用的切入方法的类:

 public class XMLGuardian {
public void guardOrchardBefore() {
System.out.println("XMLGuardian spotted a monkey is approaching the orchard...");
} public void guardOrchardAfter() {
System.out.println("XMLGuardian caught a monkey stealling peaches whoes name is ...");
}
public void guardFarmBefore() {
System.out.println("XMLGuardian spotted a monkey is approaching the farm...");
}
public void guardFarmAfter(String name,int num,Object retVal) {
System.out.println("XMLGuardian caught a monkey stealling " + num + " corns whoes name is ..." + name );
}
}

XML配置:

 <?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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="guardian" class="com.test.spring.aspectj.XMLGuardian" />
<bean id="monkey" class="com.test.spring.aspectj.Monkey" />
<aop:config> <aop:aspect id="myAspect" ref="guardian">
<aop:pointcut id="guardOrchard"
expression="execution(* com.test.spring.aspectj.Monkey.stealPeaches(..))" /> <aop:before pointcut-ref="guardOrchard" method="guardOrchardBefore" />
<aop:after-returning pointcut-ref="guardOrchard" method="guardOrchardAfter"/> <aop:pointcut id="guardFarm"
expression="execution(* com.test.spring.aspectj.Monkey.stealCorns(..))" /> <aop:before pointcut-ref="guardFarm" method="guardFarmBefore" />
<aop:after-returning pointcut="execution(* com.test.spring.aspectj.Monkey.stealCorns(..)) and args(name,num,..)" returning="retVal"
method="guardFarmAfter" />
<!-- arg-names="name1" -->
</aop:aspect>
</aop:config>
</beans>

客户端测试代码:

 ApplicationContext context = new ClassPathXmlApplicationContext("conf/xmlaspectJAppcontext.xml");
Monkey monkey = (Monkey) context.getBean("monkey");
try {
monkey.stealPeaches("mighty monkey");
monkey.stealCorns("mighty monkey",3);
} catch (Exception e) {
}

运行结果

 XMLGuardian spotted a monkey is approaching the orchard...
Monkey mighty monkey is stealling peaches...
XMLGuardian caught a monkey stealling peaches whoes name is ...
XMLGuardian spotted a monkey is approaching the farm...
Monkey mighty monkey is stealling corns...
XMLGuardian caught a monkey stealling 3 corns whoes name is ...mighty monkey

Spring AOP 只支持对bean的方法级的'切入',而且AOP的内部机制和AspectJ有所区别,Spring主要是通过动态代理来实现AOP,使用JDK的动态代理(如果被代理的bean是interface的话)或者CGLIB(如果如果被代理的bean不是interface的话).

(转)实例简述Spring AOP之间对AspectJ语法的支持(转)的更多相关文章

  1. 简单直白的去理解AOP,了解Spring AOP,使用 @AspectJ - 读书笔记

    AOP = Aspect Oriental Programing  面向切面编程 文章里不讲AOP术语,什么连接点.切点.切面什么的,这玩意太绕,记不住也罢.旨在以简单.直白的方式理解AOP,理解Sp ...

  2. spring AOP 之四:@AspectJ切入点标识符语法详解

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  3. Spring Aop中execution的语法

    参考地址:https://blog.csdn.net/zz210891470/article/details/54175107 execution(* com.sample.service.impl. ...

  4. 比较分析 Spring AOP 和 AspectJ 之间的差别

    面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化.AOP提供方面来将跨越对象关注点模块化.虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Sp ...

  5. Spring AOP应用实例demo

    AOP(Aspect-Oriented Programming.面向方面编程).能够说是OOP(Object-OrientedPrograming.面向对象编程)的补充和完好.OOP引入封装.继承和多 ...

  6. Comparing Spring AOP and AspectJ

    AOP 概念 在我们开始之前 , 让我们做一个快速.高级别审查的核心术语和概念 : 方面 — —标准 / 特征代码被分散在多个场所中的应用 , 通常不同于实际的业务逻辑 (例如 , 交易管理) .各方 ...

  7. 比较 Spring AOP 与 AspectJ

    本文翻译自博客Comparing Spring AOP and AspectJ(转载:https://juejin.im/post/5a695b3cf265da3e47449471) 介绍 如今有多个 ...

  8. Spring AOP 和 AspectJ

    现如今有许多个可用的 AOP 库,使用这些库需要能够回答以下问题: 是否与现有的或新的应用程序兼容? 在哪里可以使用 AOP ? 如何迅速与应用程序集成? 性能开销是多少? 在本文中,我们将回答这些问 ...

  9. spring AOP 之三:使用@AspectJ定义切入点

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

随机推荐

  1. linux 安装python-setuptools

    > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py > python ez_setup.py --ins ...

  2. python学习——如何判断输入是数字

    笨办法学python第35节 该节主要是讲分支与函数,主要遇到的问题是python中如何判断输入是数字. 首先原代码如下: from sys import exit def gold_room(): ...

  3. CodeForces 474B E(Contest #1)

    题意: 给你一个数n,代表n段区间,接下来有n个数(a1,a2,...an)代表每段区间的长度,第一段区间为[1,a1],第二段区间为[a1+1,a1+a2],...第i段区间为[ai-1+1,ai- ...

  4. 八皇后java算法

    import java.util.Date; public class EightQueen { public static void main(String[] args) {  long star ...

  5. JAVA时间格式转换大全

    import java.text.*; import java.util.Calendar; public class VeDate { /** * 获取现在时间 * * @return 返回时间类型 ...

  6. Servlet入门

    1.在tomcat中新建一个day01web应用,然后在web应用中新建一个web-inf/classes目录:2.在classes目录中新建一个FirstServlet.java文件:package ...

  7. Large Margin DAGs for Multiclass Classification

    Abstract We present a new learning architecture: the Decision Directed Acyclic Graph (DDAG), which i ...

  8. ReactJS实现的通用分页组件

    大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ...

  9. 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)

    ~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...

  10. 活用shape、selector和layer-list来打造自己想要的背景效果

    活用shape.selector和layer-list来打造自己想要的背景效果 2016-04-27 13:52 281人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转 ...