1、@AspectJ的JDK必须是JDK 5.0+

基于@AspectJ配置切面

@AspectJ采用注解描述切点、增强,两者只是表达式方式不同,效果相同。

@AspectJ语法基础-----切点表达式函数

AspectJ使用。Spring支持9个@AspectJ切点表达式函数,他们用不同的方式描述目标类的连接点,根据描述对象不同,可以大致分为4中类型。

#1、方法切点函数:通过描述目标类方法信息定义连接点。

#2、方法入参切点函数:通过描述目标类方法入参的信息定义连接点。

#3、目标类切点函数:通过描述目标类类型信息定义连接点。

#4、代理类切点函数:通过描述目标类的代理类的信息定义连接点。

切点函数:

类别

函数

入参

说明

#1

execution()

方法匹配模式串

表示满足某一匹配模式的所有目标类方法连接点,如execution(*greetTo(..))

#1

@annotation

方法注解类名

表示标注了特定注解的目标方法连接点,如@annotation(com.smart.anno.NeedTest)表示任何标注了@NeedTest注解的目标类方法

#2

args()

类名

通过判别目标类方法運行時入參對象的類型定義指定連接,如args(com.smart.Waiter)表示所有有且僅有一個按類型匹配于Waiter入參的方法

#2

@args()

類型注解類名

通過判別目標方法運行時入參對象的類是否標注特定注解來指定連接點,如@args(com.smart.Monitorable)表示任何這樣的一個目標方法:它有一個入參且入參對象的類標注@Monitor注解

#3

within()

target()

@within()

@target()

#4

this()

類名

假如代理類按類型匹配于指定類,則被代理的目標類所有連接點匹配切點。

函數入參中使用通配符:

$1、* 匹配任意字符,但它只能匹配上下文中的一個元素

$2、..匹配任意字符,可以匹配上下文中的多個元素,但在表示類時,必須和*聯合使用,在表示入參時單獨使用。

$3、+ 表示按類型匹配指定類的所有類,必須跟在類名後面,如com.smart.Car+

一个简单的实例:

Waiter接口

package com.smart.aspectj;

public interface Waiter
{
void greetTo(String name);
void serveTo(String name);
}

NaiveWaiter.java

package com.smart.aspectj;

public class NaiveWaiter implements Waiter
{
@Override
public void greetTo(String name)
{
System.out.println("Greet to "+name+"...");
} @Override
public void serveTo(String name)
{
System.out.println("Serving to "+name+"...");
}
}
package com.smart.aspectj;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; @Aspect //通过该注解将PreGreetingAspect标注为一个切面
public class PreGreetingAspect
{
@Before("execution(* greetTo(..))")//定義切點和增強類型
public void beforeGreeting()//增強的橫切邏輯
{
System.out.println("How are you!");
} @After("execution(* serveTo(..))")//定義切點和增強類型
public void afterGreeting()//增強的橫切邏輯
{
System.out.println("Enjoy yourself!!");
}
}
package com.smart.aspectj;

import org.junit.Test;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; public class AspectJProxyTest
{
@Test
public void testAspectJ()
{
Waiter target=new NaiveWaiter();
AspectJProxyFactory factory=new AspectJProxyFactory();
//設置目標對象
factory.setTarget(target);
//添加切面類
factory.addAspect(PreGreetingAspect.class);
//生成織入切面的代理對象
Waiter proxy=factory.getProxy();
proxy.greetTo("John");
proxy.serveTo("John");
} }

得到的结果是:

How are you!
Greet to John...
Serving to John...
Enjoy yourself!!

2、通过配置使用@AspectJ切面

beans.xml

<!-- 目標Bean -->
<bean id="waiter" class="com.smart.aspectj.NaiveWaiter"/>
<!-- 使用@AspectJ注解的切面類 -->
<bean class="com.smart.aspectj.PreGreetingAspect"/>
<!-- 自動代理創建器,自動將@AspectJ注解切面類織入目標Bean中 -->
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>

测试数据:

package com.smart.aspectj;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringAspectJTest
{
@Test
public void testAspectJ()
{
String configPath="com/smart/aspectj/beans.xml";
ApplicationContext ctx=new ClassPathXmlApplicationContext(configPath); Waiter waiter=(Waiter)ctx.getBean("waiter"); waiter.greetTo("John");
waiter.serveTo("Tom");
}
}

得出结果:

How are you!
Greet to John...
Serving to Tom...
Enjoy yourself!!

Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面的更多相关文章

  1. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

  2. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  3. 学习《Spring 3.x 企业应用开发实战》Day-1

    Day-1 记录自己学习spring的笔记 提要:根据<Spring 3.x 企业应用开发实战>开头一个用户登录的例子,按照上面敲的. 1.项目分层

  4. Spring 3.x企业实用开发实战(1)

    有关Spring的介绍这里就不赘述了,主要是学习了陈雄华版的<Spring 3.x企业应用开发实战>并做了一点笔记,以助于后期的回顾和复习. 废话不多说,直接进入主题,以下所有代码基于&l ...

  5. 《精通Spring+4.x++企业应用开发实战》读后感

    引言 还记得大三时上培训班的是时候,当时的培训老师说自己是本地讲解spring最好的讲师,但是后来等我实习了看了<Spring 3.x 企业应用开发实战>以及后续版本<精通Sprin ...

  6. 《Spring 3.x 企业应用开发实战》目录

    图书信息:陈雄华 林开雄 编著 ISBN 978-7-121-15213-9 概述: 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识. 第2章:通过一个简单的例 ...

  7. 《精通Spring 4.x 企业应用开发实战》学习笔记

    第四章 IoC容器 4.1 IoC概述 IoC(Inverse of Control 控制反转),控制是指接口实现类的选择控制权,反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中. 也就是 ...

  8. Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)

    从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...

  9. Spring 3.x企业应用开发实战(14)----事务

    Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 “ ...

随机推荐

  1. 阿里云主机SSD实例磁盘测试及IO调度算法调整

    测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ...

  2. Dev GridControl,GridView 显示多行文本及合并相同单元格

    显示多行文本的方法 首先把gridcontrol的views的Optionsview里的RowAutoHeight设置为True 在In-place Editor Repository 里添加 Mem ...

  3. (转)一小时搞定DIV+CSS布局-固定页面开度布局

    本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. 转载请标明:http://www.kwstu.com/ArticleView/divcss_20139 ...

  4. gitolite随记

    1.git clone源码 git clone git://github.com/sitaramc/gitolite 2.安装 gitolite/install -ln 3.建立git仓库 gitol ...

  5. (转)用Eclipse编译你的ROS程序

    原地址: http://blog.csdn.net/sujun3304/article/details/18572017 好了,理解了系统各个组件的含义后,还是直接进入程序真刀真枪的从实践中学习吧! ...

  6. dynamic和object浅谈

    要想知道dynamic和object的关系必须先理解它们的含义 C# 4.0提供了一个dynamic 关键字.在MSDN里是这样描述:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时 ...

  7. [Mugeda HTML5技术教程之12]制作跨屏互动应用

    mugeda动画平台还可以用来制作跨屏互动的动画应用,比如在PC端的大屏幕上显示动画的主界面,同时会显示出供手机扫描的二维码,手机扫描后会在手机上显示手机端动画界面.通过手机就可以和PC端的显示界面跨 ...

  8. hdu 5363Key Set

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5363 Problem Description soda has a set S with n inte ...

  9. Hough Transform直线检测

    本文原创,如转载请注明出处. Hough Transform 是一种能提取图像中某种特定形状特征的方法,可以将其描述成一种把图像空间中的像素转换成Hough空间中直线或曲线的一种映射函数.通过利用Ho ...

  10. js 对url字符转译全解

    1.js 对url进行字符解码设计到3个方法 escape , encodeURI , encodeURIComponent eg: var url='http://baidu.com';encode ...