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. Hadoop集群运行JNI程序

    要在Hadoop集群运行上运行JNI程序,首先要在单机上调试程序直到可以正确运行JNI程序,之后移植到Hadoop集群就是水到渠成的事情. Hadoop运行程序的方式是通过jar包,所以我们需要将所有 ...

  2. JS高级程序设计学习笔记之基本包装类型

    概述 基本类型:string.boolean.number 每当读取一个基本类型的值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据. 使用new操作符创建的 ...

  3. .NET开发人员必须知道的八个网站

    对于不熟悉.NET技术的朋友,需要说明一下,.NET提供了一个平台和一些相应的工具,.NET开发人员可以使用它们来在开发Windows桌面,互联网,甚至是手持移动设备上构建极富交互性的应用.很有可能你 ...

  4. C#语法糖: 扩展方法(常用)

    今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...

  5. Mac_配置adb环境变量

    1.打开终端Terminal. 2.进入HOME目录:命令行输入 echo(这之间有一个空格) $HOME 3.创建.bash_profile文件:命令行输入 touch(这之间有一个空格).bash ...

  6. C#this的五种用法

    this的五种用法: 1.使用被掩盖的成员变量: class AA { int a; public void set1(int a) { this.a = a;//right } public voi ...

  7. <转>请戒掉成功学和正能量,那是麻痹人的毒药 | 新知

    非常不幸的是,这将是一场非常糟糕的演说.我不想骗你们,你们从我这里几乎什么也学不到.你们在离开的时候肯定会感到失望,你们的生活并不会得到改善. 更糟糕的是,你还会意识到生活的本质毫无意义,你的一切努力 ...

  8. volatile举列说明const

    1.即使本程序中虽然不改变这种类型的值,但别的比如中断程序可能会改变这个值,加上volatile,编译器不优化,每次都重新访问这个值做判断 2.如 unsigned char flag = 1; in ...

  9. memcached介绍及基本使用

    一:概念 memcached是LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件.现在已成为mixi,hatena,facebook ...

  10. JS常用的方法

    1.时间戳转换 //时间戳(有Date和无Date的都可)转换为日期 “2016年5月30日 10:29:30 2016-05-20 09:11” function TimeConversion(ti ...