Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面
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配置切面的更多相关文章
- 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)
很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...
- Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)
前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...
- 学习《Spring 3.x 企业应用开发实战》Day-1
Day-1 记录自己学习spring的笔记 提要:根据<Spring 3.x 企业应用开发实战>开头一个用户登录的例子,按照上面敲的. 1.项目分层
- Spring 3.x企业实用开发实战(1)
有关Spring的介绍这里就不赘述了,主要是学习了陈雄华版的<Spring 3.x企业应用开发实战>并做了一点笔记,以助于后期的回顾和复习. 废话不多说,直接进入主题,以下所有代码基于&l ...
- 《精通Spring+4.x++企业应用开发实战》读后感
引言 还记得大三时上培训班的是时候,当时的培训老师说自己是本地讲解spring最好的讲师,但是后来等我实习了看了<Spring 3.x 企业应用开发实战>以及后续版本<精通Sprin ...
- 《Spring 3.x 企业应用开发实战》目录
图书信息:陈雄华 林开雄 编著 ISBN 978-7-121-15213-9 概述: 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识. 第2章:通过一个简单的例 ...
- 《精通Spring 4.x 企业应用开发实战》学习笔记
第四章 IoC容器 4.1 IoC概述 IoC(Inverse of Control 控制反转),控制是指接口实现类的选择控制权,反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中. 也就是 ...
- Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)
从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...
- Spring 3.x企业应用开发实战(14)----事务
Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 “ ...
随机推荐
- Spark 初级算子
#常用Transformation(即转换,延迟加载) #通过并行化scala集合创建RDD val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8)) #查看 ...
- windows下netstat -aon命令
windows平台下netstat常用命令 C:\Users\Administrator>netstat --help 显示协议统计和当前 TCP/IP 网络连接. NETSTAT [-a] [ ...
- VCS仿真生成vpd文件(verilog)
VCS仿真生成vpd文件(verilog) 一.环境与文件 Linux平台 csh环境 VCS 64bit 代码文件请参考<一个简单的Verilog计数器模型> 二.开始仿真 1.com ...
- IO中手机旋转事件的传递
UIApplication -> delegate -> widnow -> rootViewController
- python - socket模块1
1.使用生活中的接打电话,解释socket通信流程 2.根据上图,写出socket通信的伪代码 2.1.server端伪代码 #买手机 #买手机卡 #开机 #等待电话 #收消息 #发消息 #挂电 ...
- avalon学习笔记一 列表及条件过滤
好长时间都没有更新博客了,不是因为没有学习新的东西,而是到了新的单位每天玩命加班实在是太累了!经过一年的努力吧,终于可以轻松一下了.废话少说,直接干货吧! 由于是学习阶段,就直接拿了公司的二级页面做了 ...
- 网站全局js代码
这几天开始看公司的一套系统,整理的网站全局js代码 /*文件名:base.js功能说明:全站通用的全局变量及公用方法创建日期:2010-09-26*///引入jquery库文件document.wri ...
- android码农神器 偷懒工具 android懒人框架 LoonAndroid 3 讲解
LoonAndroid 3.0 Loonandroid是一个注解框架,不涉及任何UI效果,目的是一个功能一个方法,以方法为最小颗粒度对功能进行拆解.把功能傻瓜化,简单化,去掉重复性的代码,隐藏复杂的实 ...
- C++ BitArray 引用计数实现
#ifndef __BITARRAY__ //数组不支持多线程同时访问,没有对引用计数以及分配的资源做任何锁处理 #define __BITARRAY__ 1 //越界访问修改为抛出异常 #ifdef ...
- Opensuse13.2开启ssh
要开启ssh很简单,步骤分为三步 步骤1: 安装ssh zypper install ssh 步骤2:启动ssh daemon网上很多通过 service 命令或者 init.d 目录中的脚本启动ss ...