基于@AspectJ和schema的aop(一)
在前面我们使用Pointcut和Advice描述切点和增强, 并使用Advisor整合两者描述切面.@AspectJ使用注解来描述切点和增强.两者使用的方式不同, 但是在本质上都是一样的.
我们还是用以前的例子来举例, 学习如何使用@AspectJ来描述切点和增强.首先看一个简单的例子.
package com.bao.bao.aspectj; /** * Created by xinfengyao on 16-10-23. */ public interface Waiter { public void greetTo(String clientName); public void serveTo(String clientName); }
package com.bao.bao.aspectj; /** * Created by xinfengyao on 16-10-23. */ public class NaiveWaiter implements Waiter { @Override public void greetTo(String clientName) { System.out.println("NaiveWaiter greetTo " + clientName + "..."); } @Override public void serveTo(String clientName) { System.out.println("NaiveWaiter serveTo " + clientName + "..."); } }
下面我们使用AspectJ定义一个切面
package com.bao.bao.aspectj; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; /** * Created by xinfengyao on 16-10-23. */ @Aspect public class PreGreetingAspect { @Before("execution(* greetTo(..))") public void beforeGreeting() { System.out.println("Here are you!"); } }
我们发现, 这个类没用实现任何特殊的接口, 只是一个普通的POJO, 特殊之处是使用了@AspectJ注解.
首先在PreGreetingAspect上面标注了@Aspect的注解, 第三方程序就可以使用这个注解来判断某个类是否是一个切面;其次, 我们在beforeGreeting()方法上面标注了注解@Before, 并提供了参数execution(*greetTo(..), 这个注解提供了两个信息, @Before注解表示该增强是一个前置增强,而成员值是一个AspectJ表达式, 含义是:在目标类的greetTo()方法上织入增强, greetTo()方法可以带任意的入参和返回任意值;最后在beforeGreeting()方法中定义的就是增强逻辑, 该横切逻辑在目标方法前调用.
PreGreetingAspect通过注解, 将切点, 增强的类型和增强的逻辑糅合在一起, 是切面的定义浑然天成.PreGreetingAspect就相当于我们之前定义的BeforeAdvice, NameMatchMethodPointcut以及DefaultPointcutAdvisor联合表达的信息.
下面我们通过org.springframework.aop.aspectj.annotation.AspectJProxyFactory为NaiveWaiter生成织入PreGreetingAspect切面的代理.
package com.bao.bao.aspectj; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; /** * Created by xinfengyao on 16-10-23. */ public class AspectJProxyTest { public static void main(String[] args) { AspectJProxyFactory proxyFactory = new AspectJProxyFactory(); Waiter target = new NaiveWaiter(); proxyFactory.setTarget(target); proxyFactory.addAspect(PreGreetingAspect.class); Waiter proxy = proxyFactory.getProxy(); proxy.greetTo("tom"); proxy.serveTo("marry"); } }
运行结果:
Here are you! NaiveWaiter greetTo tom... NaiveWaiter serveTo marry...
通过输出信息我们可以看到, 代理对象的greetTo()方法已经织入了切面类所定义的横切逻辑.
虽然可以通过编程的方式织入切面, 但一般都是通过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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="waiter" class="com.bao.bao.aspectj.NaiveWaiter"/> <bean class="com.bao.bao.aspectj.PreGreetingAspect"/> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/> </beans>
在前面我们介绍过两种自动代理创建器, AnnotationAwareAspectJAutoProxyCreator能够将@AspectJ注解的切面自动织入到目标bean中.
如果使用基于schema的aop命名空间进行配置就更简单了.
<bean id="waiter" class="com.bao.bao.aspectj.NaiveWaiter"/> <bean class="com.bao.bao.aspectj.PreGreetingAspect"/> <aop:aspectj-autoproxy/>
通过aop命名空间的<aop:aspectj-autoproxy/>自动为spring容器中的那些匹配@AspectJ切面的bean自动创建代理, 完成切面织入.其实spring在内部的原理还是使用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作.
基于@AspectJ和schema的aop(一)的更多相关文章
- (spring-第19回【AOP基础篇】)基于AspectJ和Schema的AOP
基于AspectJ就是基于@AspectJ注解,基于Schema就是全部依靠配置文件.那么首先要了解Java注解. Java注解初探 在JDK5.0中,我们可以自定义标签,并通过Java语言的反射机制 ...
- 基于@AspectJ和schema的aop(二)---@AspectJ基础语法
@AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言. 1.切点表达式函数 AspectJ ...
- 基于@AspectJ和schema的aop(四)---@AspectJ进阶
@AspectJ可以使用切点函数定义切点, 我们还可以使用逻辑运算对切点进行复合运算得到复合的切点. 我们还可以对切点进行命名, 从而可以复用切点.当一个连接点匹配多个切点时, 需要考虑增强织入的顺序 ...
- 基于@AspectJ和schema的aop(三)---切点函数详解
切点函数是AspectJ表达式语言的核心, 也是使用@AspectJ进行切面定义的难点.本小节我们通过具体的实例对切点函数进行深入学习. 1.@annotation() @annotation()表示 ...
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现
转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring框架 aop操作的注解方法 基于aspectj的自动注解aop方法 抽取相同的value="execution(public void cn.itcast.f_aspect.CRUD.*())"
首先是在xml配置文件中配置好对象,然后开启aop的注解方法——即<aop:aspectj-autoproxy></aop:aspectj-autoproxy> xml代码如下 ...
- 基于Aspectj 注解实现 spring AOP
AOP 面向切面编程,是 OOP (面向对象编程)的补充 术语 横切关注点:方法中非主要业务逻辑部分 比如运算的模块:有验证参数.执行方法前的操作.执行方法.执行方法后的操作,验证参数.执行方法前后的 ...
随机推荐
- G面经prepare: Pattern Match
设定一个pattern 把 'internationalization' 变成 'i18n', 比如word是house,pattern可以是h3e, 3se, 5, 1o1s1等, 给pattern ...
- [转] asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
转自 参考 1.<% %>用来绑定后台代码 如: < % for(int i=0;i<100;i++) { Reaponse.Write(i.ToString()); } % ...
- [转] linux中pam模块
一.pam简介 Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式. 换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使 ...
- css3:与背景的相关样式
1. (1)background-origin : border-box | padding-box | content-box;(设置元素背景图片的原始起始位置.) //需要注意的是,如果背景不是n ...
- CCF真题之图像旋转
201503-1 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 ...
- angular 倒计时
$scope.countdown = ; var myTime = setInterval(function() { $scope.countdown--; $scope.$digest(); // ...
- Mysql触发器总结
触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...
- 夺命雷公狗ThinkPHP项目之----企业网站18之网站配置列表页的完成
我们点击下配置列表即可查看我们列表页的配置信息了: 其实这个最简单了,首先我们先来完成他控制器的代码: public function lists(){ $mod = M('Conf')->se ...
- 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书
<C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...
- 一个Convert、TryParse数据转换的问题
今天在进行数据转换的时候遇到一个问题,记录下,希望看到的童鞋有点用哦~ Convert.ToInt32(0.80155023553515) 结果为1 但是以下的做法,就不是想当然的结果咯~ int.T ...