学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)
Spring入门篇 学习笔记
@AspectJ 的风格类似纯 java 注解的普通 java 类
Spring 可以使用 AspectJ 来做切入点解析
AOP 的运行时仍旧是纯的 Spring AOP, 对 AspectJ 的编译器或者织入无依赖性
Spring 中配置 @AspectJ
对 @AspectJ 支持可以使用 XML 或 Java 风格的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.karonda.aop.aspectj"/><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
确保 AspectJ 的 aspectjweaver.jar (1.6.8或更高版本) 库包含在应用程序的 classpath 中
aspect
@AspectJ 切面使用 @Aspect 注解配置,拥有 @Aspect 的任何 bean 将被 Spring 自动识别并应用
用 @Aspect 注解的类可以有方法和字段,他们也可能包括切入点、通知和引入的声明
@Aspect 注解是不能通过类路径自动检测发现的,所以需要配合使用 @Component 注释或者在 XML 配置 bean
一个类中的 @Aspect 注解标识它为一个切面,并且将自己从自动代理中排除
@Component
@Aspect
public class MoocAspect {}
pointcut
一个切入点通过一个普通的方法定义来提供,并且切入点表达式使用 @Pointcut 注解,方法返回类型必须为 void
@Component
@Aspect
public class MoocAspect {@Pointcut("execution(* com.karonda.aop.aspectj.biz.*Biz.*(..))")public void pointcut() {}@Pointcut("within(com.karonda.aop.aspectj.biz.*)")public void bizPointcut() {}}
组合 pointcut
切入点表达式可以通过 &&, || 和 ! 进行组合,也可以通过名字引用切入点表达式
通过组合,可以建立更加复杂的切入点表达式
定义良好的 pointcut
AspectJ 是编译期的 AOP
检查代码并匹配连接点与切入点的代价是昂贵的
一个好的切入点应该包括以下几点:
- 选择特定类型的连接点,如:execution, get, set, call, handler
- 确定连接点范围,如:within, withincode
- 匹配上下文信息,如:this, target, @annotation
advice
添加类:
@Service
public class MoocBiz {public String save(String arg) {System.out.println("MoocBiz save : " + arg);
// throw new RuntimeException(" Save failed!");return " Save success!";}}
添加测试类:
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAspectJ extends UnitTestBase {public TestAspectJ() {super("classpath:spring-aop-aspectj.xml");}@Testpublic void test() {MoocBiz biz = getBean("moocBiz");biz.save("This is test.");}}
Before advice
在 MoocAspect 类添加方法:
// @Before("execution(* com.karonda.aop.aspectj.biz.*Biz.*(..))")@Before("pointcut()")public void before() {System.out.println("Before.");}
After returning advice
@AfterReturning(pointcut="bizPointcut()", returning="returnValue")public void afterReturning(Object returnValue) {System.out.println("AfterReturning : " + returnValue);}
After throwing advice
@AfterThrowing(pointcut="pointcut()", throwing="e")public void afterThrowing(RuntimeException e) {System.out.println("AfterThrowing : " + e.getMessage());}
After (finally) advice
最终通知必须准备处理正常和异常两种返回情况,它通常用于释放资源
@After("pointcut()")public void after() {System.out.println("After.");}
Around advice
@Around("pointcut()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Around 1.");Object obj = pjp.proceed();System.out.println("Around 2.");System.out.println("Around : " + obj);return obj;}
advice 扩展
给 advice 传递参数
args
@Before("pointcut() && args(arg)")public void beforeWithParam(String arg) {System.out.println("BeforeWithParam." + arg);}
annotation
可以用来判断方法上是否加了某注解或者方法上加的注解对应的值
定义一个注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MoocMethod {String value();}
添加注解;
@Service
public class MoocBiz {@MoocMethod("MoocBiz save MoocMethod.")public String save(String arg) {System.out.println("MoocBiz save : " + arg);
// throw new RuntimeException(" Save failed!");return " Save success!";}}
添加通知:
@Before("pointcut() && @annotation(moocMethod)")public void beforeWithAnnotaion(MoocMethod moocMethod) {System.out.println("BeforeWithAnnotation." + moocMethod.value());}
advice 的参数及泛型
public interface Sample<T>{void sampleGenericMethod (T param);void sampleGenericCollectionMethod (Collection<T> param);
}@Before("execution(* ..Sample+.sampleGenericMethod(*)) && args(param)")
public void beforeSampleMethod(MyType param){}@Before("execution(* ..Sample+.sampleGenericCollectionMethod(*)) && args(param)")
public void beforeSampleMethod(Collection<MyType> param){
}
advice 参数名称
通知和切入点注解有一个额外的 argNames 属性,它可以用来指定所注解的方法的参数名
@Before(value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && annotation(auditable)", argNames="bean,auditable")
public void audit(Object bean, Auditable a)
如果第一个参数是 JoinPoint, ProceedingJoinPoint, JoinPoint.StaticPart 那么可以忽略它
@Before(value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && annotation(auditable)", argNames="bean,auditable")
public void audit(JoinPoint jp, Object bean, Auditable a)
Introduction
允许一个切面声明一个通知对象实现指定接口,并且提供了一个接口实现类来代表这些对象
introduction 使用 @DeclareParents 进行注解,这个注解用来定义匹配的类型拥有一个新的 parent
@Aspect
public class UsageTracking{@DeclareParents(value="com.xyz.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)public class UsageTracked mixin;@Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")public void recordUsage(UsageTracked usageTracked) {usageTracked.incrementUseCount();}
}
切面实例化模型
perthis 切面通过指定 @Aspect 注解 perthis 子句实现
每个独立的 service 对象执行时都会创建一个切面实例
service 对象的每个方法在第一次执行的时候创建切面实例,切面在 service 对象失效的同时失效
@Aspect("perthis(com.xyz.myapp.SystemArchitecture.businessService())")
public class MyAspect{private int someState;@Before(com.xyz.myapp.SystemArchitecture.businessService())public void recordServiceUsage(){}}
源码:learning-spring
转载于:https://www.cnblogs.com/victorbu/p/10528957.html
学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)相关推荐
- Java缓存学习之五:spring 对缓存的支持
(注意标题,Spring对缓存的支持 这里不单单指Ehcache ) 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache ...
- Spring MVC 学习笔记 对locale和theme的支持
Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 ...
- Spring对AspectJ的支持
1.AspectJ介绍及Pointcut注解应用 (1)AspectJ @AspectJ的风格类似纯java注解的普通java类 Spring可以使用AspectJ来做切入点解析 AOP的运行时仍旧是 ...
- 实例简述Spring AOP之对AspectJ语法的支持
Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ. 一:使用AspectJ注解: 1,启用对AspectJ的支持: ...
- SpringMVC学习日记 1.Spring框架
SpringMVC学习日记 1.Spring框架 Spring简介 Spring框架是一个开源框架,由Rod Johnson组织和开发,生产目的在于简化企业级应用的开发. 主要特性 非侵入(no-in ...
- 如何理解 Spring AOP 以及使用 AspectJ?
作者 | 阿文 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在 Spring 中 AOP 是一个非常非常重要的概念,那么什么是AOP呢? AOP 即面向切面编程,也可以叫做面向方向编 ...
- Spring测试上下文缓存+ AspectJ @Transactional + Ehcache的痛苦
您在使用AspectJ @Transactionals和Spring吗? 您是否有多个SessionFactory,也许一个用于嵌入式数据库进行单元测试,一个用于实际数据库进行集成测试? 您是否遇到这 ...
- spring学习笔记(spring概述和IOC)
spring5 1.spring的概述 1.1.spring是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的. Spring 的 ...
- 从零开始学习springmvc(5)——Spring国际化和全局异常处理
[项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...
最新文章
- spark mapreduce术语梳理
- 2017百度之星程序设计大赛 - 复赛 01,03,05
- The response status was 0. Check out the W3C XMLHttpRequest Level 2 spec for
- 按键精灵易语言c,求助(把按键精灵的源码转为易语言的)
- chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
- 如何反映两条曲线的拟合精度_用水平仪如何检测导轨的直线度?
- Go语言---字符串的基本操作
- python---之打印日志logging
- 当我们在讨论机器学习时我们在说些什么?
- 【Matlab学习笔记】图像的二值化(待续)
- 【语音处理】基于matlab GUI语音信号处理与滤波【含Matlab源码 1663期】
- NOIP2017总结
- AE2017 安-装-破-解
- Kettle工具——Spoon、Kitchen、Pan、Carte
- “风味人间”与计算机程序设计艺术《禅与计算机程序设计艺术》
- 机器学习(周志华) 第九章聚类
- Traffic shaping 一个事半功倍的程序化”噪音“解决方案
- sql创建查询视图语句
- 智能驾驶事故频发,AEB为何无法「兜底」安全
- 计算机一级选择题计算题,计算机一级选择题计算一级选择题.doc
热门文章
- Linux文件查找命令find
- UA OPTI501 电磁波3 SI单位制与电磁学常用单位
- 数组名与数组指针的关系
- Linux内核编译学习1
- 图解Windows域的命令行操作
- 「ZJOI2016」大森林 解题报告
- Dynamic Rankings——带修改区间第k大
- Object类-try-catch-finally-throw-throws-自定义异常
- [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules
- 实现透明渐变的Activity