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. ListView的Item被点击和其中的Button被点击同时生效

    Android开发中在ListView中经常有Button或ImageButton等需要被点击的控件,如果不加一些特殊的限制,有可能 ListView的Item的点击事件或Button的点击事件,其中 ...

  2. 实现简单的django上传文件

    本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...

  3. 解决 Google 重定向,体验 Google 本味

    想要体验原汁原味的 Google(google.com),下面的方案是我用过的较方便的方案. 欢迎更正及补充 Chrome 扩展 Chrone 商店有一款禁止重定向的扩展 NoCountryRedir ...

  4. node-sqlite3-API-归纳总结

    SQLITE3-API-LIST:API1. new sqlite3.Database(filename,[mode],[callback]) 返回数据库对象并且自动打开和连接数据库 它没有独立打开数 ...

  5. iOS9TableView分割线默认不显示,只有滑动的时候才显示 解决办法

    只有iOS9和iPhone6 plus模拟器上TableView分割线不会显示,后来终于找到了原因: 由于iPhone6 plus的分辨率较高,开发的时候同常都使用command + 3 或者 com ...

  6. 如何debug android cts

    启动和关闭ADB服务(adb start-server和adbkill-server) 经作者测试,模拟器在运行一段时间后,adb服务有可能(在Windows进程中可以找到这个服务,该服务用来为模拟器 ...

  7. JSONP有什么作用

    1.解决跨域访问数据                 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求 ...

  8. hibernate多对多映射文件详解(一)

    1.仓库表属性 public class WarehouseNew implements java.io.Serializable { // Fields private static final l ...

  9. mysql中自动更新时间CURRENT_TIMESTAMP

    timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP http://blog.163.com/qiongling007@126/b ...

  10. python视频教程大全集下载

    python3英文视频教程(全87集) http://pan.baidu.com/s/1dDnGBvV Python从入门到精通视频(全60集)链接:http://pan.baidu.com/s/1e ...