文章目录

  • 导读
  • 概述
  • 实例

导读

Spring-AOP 自动创建代理

Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator

Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


概述

我们知道切面Advisor是切点和增强的复合体,Advisor本身已经包含了足够的信息,如横切逻辑及连接点。

DefaultAdvisorAutoProxyCreator能够扫描Advisor,并将Advisor自动织入匹配的目标Bean中,即为匹配的目标Bean自动创建代理。


实例

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

在 Spring-AOP 静态正则表达式方法匹配切面通过ProxyFactoryBean为waiter和seller配置了代理,如下

<?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"><!-- 配置切面:静态正则表达式方法匹配切面 --><!-- Waiter目标类 --><bean id="waiterTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Waiter"/><!-- Seller目标类 --><bean id="sellerTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Seller"/><!-- 前置增强 --><bean id="greetBeforeAdvice" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.GreetBeforeAdivce"/><!-- 切面 --><bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"p:advice-ref="greetBeforeAdvice"p:pattern=".*greet.*" > <!--  向切面注入一个前置增强  , 用正则表达式定义目标类全限定方法名的匹配模式串 。--></bean><!-- 通过父bean,配置公共的信息 --><bean id="parent" abstract="true"  class="org.springframework.aop.framework.ProxyFactoryBean"p:interceptorNames="regexpAdvisor"p:proxyTargetClass="true"/><!-- waiter代理 --><bean id="waiter" parent="parent" p:target-ref="waiterTarget"/><!-- seller代理 --><bean id="seller" parent="parent" p:target-ref="sellerTarget"/></beans>

在这里引入DefaultAdvisorAutoProxyCreator为容器中所有带 “greet”方法名的目标Bean自动创建代理,配置如下

<?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"><!--通过Advisor自动创建代理--><!-- 目标Bean --><bean id="waiter" class="com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator.Waiter"/><bean id="seller" class="com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator.Seller"/><!-- 增强 --><bean id="greetingBeforeAdvice" class="com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator.GreetingBeforeAdvice"/><!-- 切面 --><bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"p:patterns=".*greet.*"p:advice-ref="greetingBeforeAdvice"/><!-- 代理 --><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/></beans>

最后一行,用DefaultAdvisorAutoProxyCreator定义一个Bean,它负责将容器中的Advisor织入匹配的目标Bean中。

测试类:

package com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class DefaultAdvisorProxyCreatorTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/autoCreateProxy/DefaultAdvisorProxyCreator/conf-defaultAdvisorProxyCreator.xml");Waiter waiter = ctx.getBean("waiter", Waiter.class);waiter.greetTo("XiaoGongJiang");waiter.serverTo("XiaoGongJiang");System.out.println("\n");Seller seller = ctx.getBean("seller", Seller.class);seller.greetTo("XiaoGongJiang");seller.serverTo("XiaoGongJiang");}
}

运行结果

2017-08-21 16:28:37,239  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb6dcf9: startup date [Mon Aug 21 16:28:37 BOT 2017]; root of context hierarchy
2017-08-21 16:28:37,388  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/autoCreateProxy/DefaultAdvisorProxyCreator/conf-defaultAdvisorProxyCreator.xml]
Pointcut:com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator.Waiter.greetTo
How are you XiaoGongJiang ?
Waiter Greet To XiaoGongJiang
Waiter Server To XiaoGongJiangPointcut:com.xgj.aop.spring.advisor.autoCreateProxy.DefaultAdvisorProxyCreator.Seller.greetTo
How are you XiaoGongJiang ?
Seller Greet To XiaoGongJiang
Seller Server To XiaoGongJiang

从运行结果中,只有greetTo方法被织入了增强,由此可见,增强被正确的织入匹配的连接点中。

Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator相关推荐

  1. Spring AOP自动创建代理 和 ProxyFactoryBean创建代理

    Advice 通知类型 AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice,Spring按照通知Advice在目标方法的连接点位置,可以分为5种 ...

  2. Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator

    文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...

  3. Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

    文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...

  4. Spring-AOP 自动创建代理

    导读 概述 实现类介绍 BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AnnotationAwareAspectJAutoProxyC ...

  5. Spring : Spring Aop CGLIB动态代理调用过程

    1.美图 2.概述 CGLIB动态代理参考: CGLIB动态代理 CGLIB原理解析参考:CGLIB原理解析 3.分析 Spring AOP CGLIB动态代理调用过程分析,CGLIB动态代理调用过程 ...

  6. SpringBoot/Spring AOP默认动态代理方式

    Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中, ...

  7. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  8. spring—AOP 的动态代理技术

    AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 JDK 代理 public class proxy {@Testpubl ...

  9. SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

    1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...

最新文章

  1. 关于中值滤波算法,以及C语言实现(转)
  2. 梯度下降原理及在线性回归、逻辑回归中的应用
  3. 用户可以使用三种方式使用计算机,计算机操作系统期末复习笔记
  4. : 字符向量未正常终止_文本挖掘从小白到精通(一)---语料、向量空间和模型的概念...
  5. java bufferedwriter 写入tab_Java-IO流
  6. linux日常运维命令
  7. switch_case,,||,条件操作符和逗号操作符,循环语句
  8. 【0201】用户登录界面设计
  9. Node.js-威富通H5微信支付
  10. 敏捷开发和瀑布开发的区别
  11. orcale和mysql跨库查询_Oracle如何实现跨库查询
  12. 台式计算机如何取消屏幕密码,台式电脑怎么取消锁屏?
  13. 文件没保存怎么恢复?试试这个方法恢复数据
  14. 宝可梦 序列号认证服务器发生了错误,宝可梦探险寻宝无法连接服务器是什么原因...
  15. 汉子转五笔SQL脚本函数
  16. [球体积交]Girlfriend 2021牛客多校第2场 F
  17. 信号的宽带和计算机网络的宽带有什么不同,计算机网络(一)带宽理解
  18. 论文精读: MapReduce
  19. 利用fullpage插件,快速开发整屏翻页的页面
  20. VS中C++导入并使用DLL文件使用步骤

热门文章

  1. py2neo 基本用法
  2. webpack打包vue反编译_2020年你必须知道的webpack打包优化方法
  3. 页面文件太小无法完成操作_手机上也能轻松完成文件压缩操作,无需软件,可惜知道的人才10%...
  4. mac安装opencv
  5. python笔记 xpinyin
  6. 扒一扒搜索引擎是如何工作的?
  7. 对数线性模型之一(逻辑回归), 广义线性模型学习总结
  8. 朴素贝叶斯(NaiveBayes)算法总结
  9. android 9patch 漏洞,Android 9patch 图片解析堆溢出漏洞分析(CVE-2015-1532)
  10. python 柱状图宽度设置_Python matplotlib 柱状图实例