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 的支持 (完结)相关推荐

  1. Java缓存学习之五:spring 对缓存的支持

    (注意标题,Spring对缓存的支持 这里不单单指Ehcache ) 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache ...

  2. Spring MVC 学习笔记 对locale和theme的支持

    Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 ...

  3. Spring对AspectJ的支持

    1.AspectJ介绍及Pointcut注解应用 (1)AspectJ @AspectJ的风格类似纯java注解的普通java类 Spring可以使用AspectJ来做切入点解析 AOP的运行时仍旧是 ...

  4. 实例简述Spring AOP之对AspectJ语法的支持

    Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ. 一:使用AspectJ注解: 1,启用对AspectJ的支持: ...

  5. SpringMVC学习日记 1.Spring框架

    SpringMVC学习日记 1.Spring框架 Spring简介 Spring框架是一个开源框架,由Rod Johnson组织和开发,生产目的在于简化企业级应用的开发. 主要特性 非侵入(no-in ...

  6. 如何理解 Spring AOP 以及使用 AspectJ?

    作者 | 阿文 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在 Spring 中 AOP 是一个非常非常重要的概念,那么什么是AOP呢? AOP 即面向切面编程,也可以叫做面向方向编 ...

  7. Spring测试上下文缓存+ AspectJ @Transactional + Ehcache的痛苦

    您在使用AspectJ @Transactionals和Spring吗? 您是否有多个SessionFactory,也许一个用于嵌入式数据库进行单元测试,一个用于实际数据库进行集成测试? 您是否遇到这 ...

  8. spring学习笔记(spring概述和IOC)

    spring5 1.spring的概述 1.1.spring是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的. Spring 的 ...

  9. 从零开始学习springmvc(5)——Spring国际化和全局异常处理

    [项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...

最新文章

  1. spark mapreduce术语梳理
  2. 2017百度之星程序设计大赛 - 复赛 01,03,05
  3. The response status was 0. Check out the W3C XMLHttpRequest Level 2 spec for
  4. 按键精灵易语言c,求助(把按键精灵的源码转为易语言的)
  5. chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
  6. 如何反映两条曲线的拟合精度_用水平仪如何检测导轨的直线度?
  7. Go语言---字符串的基本操作
  8. python---之打印日志logging
  9. 当我们在讨论机器学习时我们在说些什么?
  10. 【Matlab学习笔记】图像的二值化(待续)
  11. 【语音处理】基于matlab GUI语音信号处理与滤波【含Matlab源码 1663期】
  12. NOIP2017总结
  13. AE2017 安-装-破-解
  14. Kettle工具——Spoon、Kitchen、Pan、Carte
  15. “风味人间”与计算机程序设计艺术《禅与计算机程序设计艺术》
  16. 机器学习(周志华) 第九章聚类
  17. Traffic shaping 一个事半功倍的程序化”噪音“解决方案
  18. sql创建查询视图语句
  19. 智能驾驶事故频发,AEB为何无法「兜底」安全
  20. 计算机一级选择题计算题,计算机一级选择题计算一级选择题.doc

热门文章

  1. Linux文件查找命令find
  2. UA OPTI501 电磁波3 SI单位制与电磁学常用单位
  3. 数组名与数组指针的关系
  4. Linux内核编译学习1
  5. 图解Windows域的命令行操作
  6. 「ZJOI2016」大森林 解题报告
  7. Dynamic Rankings——带修改区间第k大
  8. Object类-try-catch-finally-throw-throws-自定义异常
  9. [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules
  10. 实现透明渐变的Activity