AOP的通知类型:

aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持。

AOP 联盟不是Spring的,先是AOP联盟定义了一个接口org.springframework.aop.Advice 而Spring觉得不错,就改写了分成5种类型

aop联盟定义5种通知

前置通知 org.springframework.aop.MethodBeforeAdvice

在目标方法执行前实施增强

后置通知 org.springframework.aop.AfterReturningAdvice

在目标方法执行后实施增强

环绕通知 org.aopalliance.intercept.MethodInterceptor

在目标方法执行前后实施增强

异常抛出通知 org.springframework.aop.ThrowsAdvice

在方法抛出异常后实施增强

引介通知 org.springframework.aop.IntroductionInterceptor(了解)对一个类进行增强(添加方法或属性等)

在目标类中添加一些新的方法和属性

如果使用aop联盟规范进行aop开发,所有的通知必须实现接口。(底层为了确定通知方法名称)


Advisor和Aspect区别:

Advisor : Spring传统的切面.一般都是由一个切入点和一个通知的组合.(单个)

 Aspect  : Aspect是真正意义上的切面.是由多个切入点和多个通知组合.(多个)


AOP基于AspectJ的自动代理(实现了接口,配置用<aop:Advisor>):

因为使用AOP,所以Spring需要的包以外,还要导入

联盟API开发包.jar----------->(依赖包下)

AOP所需要的核心包.jar----->(主包下)

1.切面类

需要总结:

需要根据AOP联盟确定一个通知类型:这里使用环绕通知

所以切面类随便写,随便实现一个通知类型,重写里面的invok方法在,通过参数调用

proceed()执行目标类,前后可以写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mickeymouse.proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
  * 切面类:包含两个通知(增强)
     环绕通知必须手动执行方法
  * @author Mickey-Mouse
  *
  */
public class MyAspect implements MethodInterceptor {
     public Object invoke(MethodInvocation mi) throws Throwable {
         System.out.println( "已校验是否符合身份" );
         //环绕通知必须手动执行方法
         Object object = mi.proceed();
         System.out.println( "方法已经执行完--->后处理" );
         return object;
     }
}
2.目标类(已实现接口)
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mickeymouse.proxy;
public class ProductsServiceImpl implements ProductsService {
     /**
      * 目标类:
      * 里面有两个连接点
      */
     public void addProducts(){
         System.out.println( "添加商品成功" );
     }
     public void updateProducts(){
         System.out.println( "修改商品成功" );
     }
}
3.自动代理XML配置

因为是AOP开发,所有需要引入AOP的DTD约束

与AOP的半自动代理的区别在于:

半自动代理没有使用AOP约束,要手动配置代理类与目标类的关系

半自动代理是基于ProxyFactoryBean的代理类:

            缺点:

                    * 配置麻烦:

                    * 需要为每一个要增强的类配置一个ProxyFactoryBean.(只要有增强,就需要写一个ProxyFactoryBean的配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<? 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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- bean definitions here -->
<!-- 自动代理模式 -->
<!-- 创建切面类 -->
< bean id = "myAspect" class = "com.mickeymouse.proxy.MyAspect" />
<!-- 创建目标类实现 -->
< bean id = "productsService" class = "com.mickeymouse.proxy.ProductsServiceImpl" />
<!-- 利用AOP约束,建立切面的 通知与切入点  之间的关系 -->
<!-- AOP的配置头 -->
< aop:config >
     <!--
      切入点配置:
      expression:AspectJ编程的表达式(说明利用了这个框架,所以注意导包)
      Id:切入点名称,连接通知的索引名
      -->
     < aop:pointcut expression = "execution(* com.mickeymouse.proxy.ProductsServiceImpl.*())" id = "mypointcut" />
     <!--
     切面配置:
       advice-ref:通知/增强点
       pointcut-ref=切点
       proxy-target-class="true" 表示强制使用CGLIB
      因为Spring默认是使用动态代理的方式,而CGLIB是使用目标类     生成子类代理的方式(也就是不使用接口)
     -->  
     < aop:advisor advice-ref = "myAspect" pointcut-ref = "mypointcut" />
</ aop:config >
</ beans >
XML分析:(总结4步)

1.配置切面类的Bean实例

2.配置目标类的Bean实例

3.配置切入点(结合exeution表达式)

4.配置切面(切入点和通知/加强点)

结果:



AOP自动代理:(切面类不需要实现接口/配置用<aop:aspect>)

1 . 目标类:(同上)
2 . 切面类:(随便写)eg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.mickeymouse.proxy.auto;
import org.aspectj.lang.ProceedingJoinPoint;
/**
  * 切面类:随便写
  * @author Mickey-Mouse
  *
  */
public class MyAspect {
     /**
      * 环绕配置切面类
      * @param proceedingJoinPoint 环绕需要手动开启方法
      * @return
      * @throws Throwable
      */
     public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
         System.out.println( "已校验是否符合身份" );
         Object object = proceedingJoinPoint.proceed();
         System.out.println( "方法已经执行完--->后处理" );
         return object;
     }
}
3 . XML配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 自动代理模式 -->
     <!-- 切面类 -->
     < bean id = "myAspect" class = "com.mickeymouse.proxy.auto.MyAspect" />
     <!-- 目标类 -->
     < bean id = "productsService" class = "com.mickeymouse.proxy.auto.ProductsServiceImpl" />
     <!-- AOP自动代理配置: -->
     < aop:config >
         <!-- 切入点 -->
         < aop:pointcut expression = "execution(* com.mickeymouse.proxy.auto.ProductsServiceImpl.*())" id = "mypointcut" />
         <!-- 切面 -->
         < aop:aspect ref = "myAspect" >
             < aop:around method = "around" pointcut-ref = "mypointcut" />
         </ aop:aspect >
     </ aop:config >
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mickeymouse.proxy.auto;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
     @Test
     public void test1(){
         ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" );
         ProductsService bean = applicationContext.getBean( "productsService" ,ProductsService. class );
         bean.addProducts();
         bean.updateProducts();
     }
}
结果图:

转载于:https://my.oschina.net/mickeymouse/blog/519120

AOP的自动代理(基于AspectJ框架)相关推荐

  1. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP 源码解析系列,建议大家按顺序阅读,欢迎讨论 Spring源码-AOP(一)-代理模式 Spring源码- ...

  2. Spring Aop(四)——基于Aspectj注解的Advice介绍

    4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.after return.after throwing.after(finally)和arou ...

  3. Spring AOP技术(基于AspectJ)的Annotation开发

    Spring AOP技术(基于AspectJ)的Annotation开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring ...

  4. AOP的半自动代理 及 缺点

    AOP的通知类型: aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持. aop联盟定义5种通知 前置通知 org.springframework.aop.MethodBefore ...

  5. Spring框架基于AspectJ的AOP开发规范和步骤

    AOP和动态代理的关系: AOP术语: 横向关注点: 需要新增的到业务代码中的功能(在目标对象那里叫横切关注点,在切面类中叫通知) 切面类: 封装了增强方法(横向关注点)的类 通知: 切面类中的每一个 ...

  6. 基于@AspectJ配置Spring AOP之一--转

    原文地址:http://tech.it168.com/j/2007-08-30/200708302209432.shtml 概述 在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的接口,并 ...

  7. Spring核心部分之AOP,aspectJ框架实现AOP,切入点表达式

    1. 面向切面编程(Aspect Oriented Programming,AOP) AOP:以切面为核心,确定切面的执行时间以及执行位置,底层实现是动态代理. AOP的作用:①在不改动源代码的情况下 ...

  8. Spring AOP技术(基于AspectJ)的XML开发

    Spring AOP技术(基于AspectJ)的XML开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring AOP技术基 ...

  9. Spring基于AspectJ实现AOP操作

    基于AspectJ实现AOP操作 准备工作 在项目工程里面引入 AOP 相关依赖. 如果是maven项目,使用pom.xml代替引入jar包的过程(注意) 学会使用切入点表达式 AOP 操作(Aspe ...

最新文章

  1. 怎么判断膝关节错位_路走多了,膝盖疼是怎么回事?
  2. jQuery中用来让元素显示和隐藏的函数
  3. winform(MDI窗体容器、权限设置)
  4. 使用tab键分割的文章能快速转换成表格。( )_word排版技巧:活用Enter键提高工作效率...
  5. C++ Primer 5th笔记(2)chapter 2变量和基本类型:引用、const
  6. js字符串与数组的处理
  7. 每日一笑 | 大学教室的真实写照...
  8. 【英语学习】【English L06】U04 Adventure L3 The city playground and some famous museums
  9. html,htm,jhtml
  10. javassm框架项目实例_面试官:小伙子,给我说一下spring框架吧
  11. 什么是JBPM工作流
  12. 安装linux系统 黑屏,Ubuntu 16.04安装时显示器黑屏处理
  13. Docker下安装部署MsSql
  14. c语言电子表格复制数据错误循环冗余检查,xp系统提示“数据错误(循环冗余检查)”如何解决...
  15. Bailian2706 麦森数【大数】
  16. 微信第三方授权生成二维码api
  17. 输入账号 密码 实现登录功能
  18. 责任链模式与lambda重构责任链模式
  19. EasyPusher手机直播编码推送之图像旋转90度后画面重复的问题
  20. DY-Tiva-PB 资料 电路图

热门文章

  1. 经典| 单轨RGV环形穿梭车| 连续搬运
  2. oracle做全年日历表,Oracle之一份标准日历表的构建
  3. MFC实现FTP客户机制作
  4. IT运维管理工具大全
  5. 我国大数据产业的发展展望
  6. PL/SQL Developer将大小写转换图标定制到工具栏
  7. 工业和医疗行业的负荷和应变测量
  8. 考研计算机专业简历怎么写,考研简历怎么写比较好
  9. JAVA实习生刚进入公司一般会被安排做什么样的工作?
  10. 研究光源宽度对干涉条纹可见度的影响(matlab仿真)