• 概述
  • 在Spring中配置
    • 通过配置文件实现增强

      • 配置文件
      • ProxyFactory Bean配置文件当中常用的属性
      • 测试类
    • 其他代码

概述

在上篇博文的案例中

Spring-AOP 创建增强类-前置增强

我们使用org.springframework.aop.framework.ProxyFactory通过编码的方式将GreetingBeforeAdvice的增强织入目标类NaiveWaiter中

结合我们前面说的
Java-JDK动态代理

Java-CGLib动态代理

动态代理技术是不是很相似?

我们看下的源码 ProxyFactoryBean#setProxyInterfaces

可以发现,ProxyFactoryBean的内部其实就是使用JDK或者CGLib动态代理技术将增强应用到目标类中的。

Spring定义的AOPProxy类具有两个final类型的实现类,如下图所示

  • Cglib2AopProxy是使用cglib代理技术来创建代理

  • JdkDynamicAopProxy是使用jdk代理技术来创建代理

如果通过ProxyFactory的setInterfaces(Class[] interfaces)方法指定目标接口进行代理,则ProxyFactory使用JdkDynamaicAopProxy,如果针对类的代理,则使用Cglib2AopProxy.

此外,还可以通过ProxyFactory的setOptimize(true)方法让ProxyFactory启动优化代理方式,这样,针对接口的代理也会使用Cglib2AopProxy。

我们使用JDK代理来实现 Spring-AOP 增强(Advice)类型和创建增强类 中的业务测试类

//创建代理工厂对象
ProxyFactory factory=new ProxyFactory();
//设置代理接口
factory.setInterfaces(target.getClass().getInterfaces());
//设置代理类
factory.setTarget(target);
//设置增强类
factory.addAdvice(advice);

使用CGLib代理实现则为:

ProxyFactory factory=new ProxyFactory();
//设置代理接口
factory.setInterfaces(target.getClass().getInterfaces());
//启用优化,将启用cglib代理方式
factory.setOptimize(true);
//设置代理类
factory.setTarget(target);
//添加增强类
factory.addAdvice(advice);

ProxyFactory通过addAdvice来增加一个增强。 用户可以使用该方法增加多个增强,通过增强形成一个增强链,他们的调用顺序和添加顺序是一致的


在Spring中配置

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

通过配置文件实现增强

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="target" class="com.xgj.aop.spring.advice.proxyFactory.NaiveWaiter"/><bean id="greetingBeforeAdvice" class="com.xgj.aop.spring.advice.proxyFactory.GreetingBeforeAdvice"/><bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"p:proxyInterfaces="com.xgj.aop.spring.advice.proxyFactory.Waiter"p:interceptorNames="greetingBeforeAdvice"p:target-ref="target"/></beans>

ProxyFactory Bean配置文件当中常用的属性

  • target:我们需要代理的目标对象

  • proxyInterfaces:代理所要实现的接口,可以是多个接口

  • interceptorNames:需要织入的目标对象的Bean的列表(增强类的Bean列表),使用Bean的名称来指定。

  • singleton:确定返回的代理是不是单实例的,系统默认返回的是单实例的。

  • optimize:当值为true时,强制使用cglib代理。当是singleton的实例时我们推荐使用cglib代理,当是其他作用域的时候,推荐使用JDK的代理。原因是cglib创建代理速度比较慢,但是运行效率高。JDK代理则刚好相反。

  • proxyTargetClass:是否对类进行代理而不是对接口进行代理,当值为true的时候使用cglib代理

将proxyTargetClass设置为true后,无需再设置proxyInterfaces属性,即使设置了也会被ProxyFactory忽略

测试类

package com.xgj.aop.spring.advice.proxyFactory;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeforceAdivceByXmlTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advice/proxyFactory/beans.xml");Waiter waiter = ctx.getBean("waiter", Waiter.class);waiter.greetTo("Xiao");waiter.serverTo("GongJiang");}
}

运行单元测试:

其他代码

业务接口类:Waiter.Java
业务实现类:NativeWaiter.java
业务增强类:GreetingBeforeAdvice.java

参考 Spring-AOP 增强(Advice)类型和创建增强类#实例-通过代码实现增强

Spring-AOP 通过配置文件实现 前置增强相关推荐

  1. android aop静态方法,spring aop 不能对静态方法进行增强解决

    想要通过aop的方式记录HttpUtils发出的post请求日志,但是 aop 不能对静态方法进行增强.只能对实例方法进行增强.. 如果一定要增强静态方法,我们可以对目标类使用单例模式,然后通过调用实 ...

  2. Spring AOP 标签形式及Around增强处理

    上一篇文章介绍了下Spring中的AOP xml配置方式.想了解的同学可以点击这里查看. 这次写一下标签形式. <aop:aspectj-autoproxy /> 首先要在spring配置 ...

  3. spring aop代码的增强

    这篇博客,主要会分析spring aop是如何实现代码增强的. 从上一篇博客 我们大概知道,spring能在不改变代码的前提下,往一个方法的之前和之后添加代码. 想下,java中有哪种技术可以帮我们实 ...

  4. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  5. Spring AOP 切点 Pointcut 表达式介绍与使用

    一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...

  6. AOP常用的几种增强方式,各自的特点

    SpringAOP的5种增强类型应用讲解 一.前言 spring框架中为我们提供的增强包括针对切面的增强和针对切入点的增强,对一个方法的增强底层使用的是动态代理,所以在学习springAop增强之前大 ...

  7. Spring AOP中是如何注册Advisor的?

    前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...

  8. 跟着小马哥学系列之 Spring AOP(基于 XML 定义 Advice 源码解析)

    学好路更宽,钱多少加班. --小马哥 简介 大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间< ...

  9. java aop管理权限_基于spring aop 权限管理系统原型 - andyj2ee - BlogJava

    此权限管理系统把待访问的业务层方法做为权限管理中的资源,通过spring aop 对接口方法进行拦截,来实现权限的管理,可以实现细粒度的权限控制. 在上文体验了spring aop 一些特性,aop ...

最新文章

  1. 【6月活动】投稿换T恤!只要你愿意分享!这件酷炫的T恤就是你的~!!
  2. c语言猜拳游戏中出现的关键词,C语言猜拳游戏代码及分析
  3. 数据挖掘之聚类k-means
  4. java类同步,Java同步工具類(一)
  5. 技术人员是如何分析游戏环境的? 《影之诗》牌组趋势分析
  6. ------shell学习
  7. 最后一周|高级转录组分析和R语言数据可视化第十二期 (线上线下同时开课)...
  8. 提高篇 第四部分 数据结构 第2章 RMQ问题
  9. 演练表创建 用户表my_user 追加了列 mysql 20210413_122410
  10. 解说linux下proc文件系统
  11. 【PAT刷题甲级】部分笔记1065-1155~(下)
  12. Ubuntu软件商店下载速度慢
  13. python九九乘法表右上三角解析_九九乘法表右上三角,c语言
  14. C语言中实现字符串的拼接
  15. ‘’三门问题‘’详解以及python验证
  16. 华为鸿蒙是安卓9,鸿蒙“翻车”了?网友发现全新的鸿蒙系统居然是安卓9.0,华为骗我们?...
  17. 没有参加职工养保不要紧,城乡居民基本养老保险了解一下~
  18. TCP 漕河泾算法(tcp_caohejing)
  19. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
  20. android 计步器 开发,Android计步器开发

热门文章

  1. 有符号二进制数--补码
  2. tf.dtypes.cast
  3. 概要设计 重要性_儿童户外游乐场应如何设计-户外游乐设备厂家【经验分享】...
  4. 87. Leetcode 343. 整数拆分 (动态规划-基础题)
  5. 判断两个字符串是否是变形词
  6. 语音识别(一):特征抽取~1.1 抽样(sampling)和量化(quantization)
  7. 深度学习核心技术精讲100篇(六十四)-特征选择原理及应用实战案例
  8. 【毕业求职季】-听说你想去大厂看学妹,教你京东软件产品经理面试如何一把过
  9. 深度学习核心技术精讲100篇(三十六)-EdgeRec:边缘计算在淘宝推荐系统中的大规模应用
  10. tableau必知必会之学做时尚的环状条形图(跑道图)