Spring aop学习

  1. 让应用对象只关注自己所针对的业务,其他方面问题(如日志,安全,事物)交由其他应用对象来处理
  2. 将横切关注点与业务逻辑相分离,即面向切面编程
  3. 依赖注入利于应用对象间解耦,切面编程实现横切关注点和他们所所影响的对象之间的解耦
  4. spring自己实现了一整套AOP架构,底层是jdk动态代理和cglib,但后来不理想,所以支持可以集成aspectj,目前主流是spring+Aspectj(来自网上)
  5. 软件开发中,分布于应用中多处的功能被称为“横切关注点”
  6. 继承和委托是最常见的实现重用通用功能的面向对象技术
  7. 横切关注点可以被模块化为特殊的类,这些类被称为切面
  8. “切面”的工作被称为“通知”
  9. spring切面可以应用5种类型的通知:
    Before:在方法被调用之前调用通知;
    After:在方法完成之后调用通知,无论方法执行是否成功;
    After-returning:在方法成功执行之后调用通知;
    After-throwing:在方法抛出异常后调用通知;
    Around:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
  10. 连接点Joinpoint:连接点是在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时,抛出异常时等,即添加新的行为,是程序执行过程中能够应用通知的所有点
  11. 切点Pointcut:切点有助于缩小切面所通知连接点的范围
  12. 切面Aspect:切面是通知和切点的结合
  13. 引入Introduction:引入允许我们向现有的类添加新方法或属性
  14. 织入Weaving:织入是将切面应用到目标对象来创建新的代理对象的过程(分为编译期,类加载期,运行期)
  15. 创建切点来定义切面织入的连接点是AOP框架的基本功能
  16. AspectJ,JBoss AOP,Spring AOP
  17. Spring AOP的支持局限于方法拦截,如果超过简单方法拦截的范畴(如构造器或属性拦截),那么应该考虑在AspectJ里面实现切面,即将bean注入到AspectJ切面中
  18. Spring通知是java编写的,Spring在运行期通知对象,Spring只支持方法连接点(因为spring只支持方法连接点,无法更细粒度的进行拦截)
  19. 使用切点选择连接点,关于spring aop的AspectJ切点,最重要的一点是spring仅支持AspectJ切点指示器的一个子集
  20. execution()指示器是唯一的执行匹配,而其他的指示器都是用于限制匹配的,所以execution()指示器是我们编写切点定义时最主要使用的指示器
  21. 编写切点以触发通知,指示器之前可以使用and/or/not(或&&/||/!)来连接,即同时使用多个指示器,xml对&有特殊含义,觉得不好,还是用and吧
    1
    execution(* com.springaop.test.Instrument.play(..)) and within(com.springaop.test.*)
1
2
3
4
说明:
方法表达式以*号开始,说明我们不关心方法返回值类型
我们指定了全限定类名和方法名
方法参数列表使用(..)标识切点选择任意的play()方法,无论该方法的入参是什么
  1. spring也可以配置面向自己的bean()指示器进行织入
  2. aop配置元素必须在元素内
  3. 元素声明了一个简单的切面.audience是一个bean
  4. 注意DRY(不要重复你自己)原则,如果切点pointcut元素内容一致,可以提取出来放到标签,注意设置id,织入时使用pointcut-ref引用id
  5. 实际我们有时需要在前置通知和后置通知之间共享信息,即可以只有一个方法(此方法包含一个ProceedingJoinPoint参数),但它包含多个功能,此时可以使用环绕通知,
  6. 为通知传递参数