Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
文章目录
- 导读
- 概述
- 实例
导读
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相关推荐
- Spring AOP自动创建代理 和 ProxyFactoryBean创建代理
Advice 通知类型 AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice,Spring按照通知Advice在目标方法的连接点位置,可以分为5种 ...
- Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator
文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...
- Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...
- Spring-AOP 自动创建代理
导读 概述 实现类介绍 BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AnnotationAwareAspectJAutoProxyC ...
- Spring : Spring Aop CGLIB动态代理调用过程
1.美图 2.概述 CGLIB动态代理参考: CGLIB动态代理 CGLIB原理解析参考:CGLIB原理解析 3.分析 Spring AOP CGLIB动态代理调用过程分析,CGLIB动态代理调用过程 ...
- SpringBoot/Spring AOP默认动态代理方式
Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中, ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- spring—AOP 的动态代理技术
AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 JDK 代理 public class proxy {@Testpubl ...
- SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录
1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...
最新文章
- 关于中值滤波算法,以及C语言实现(转)
- 梯度下降原理及在线性回归、逻辑回归中的应用
- 用户可以使用三种方式使用计算机,计算机操作系统期末复习笔记
- : 字符向量未正常终止_文本挖掘从小白到精通(一)---语料、向量空间和模型的概念...
- java bufferedwriter 写入tab_Java-IO流
- linux日常运维命令
- switch_case,,||,条件操作符和逗号操作符,循环语句
- 【0201】用户登录界面设计
- Node.js-威富通H5微信支付
- 敏捷开发和瀑布开发的区别
- orcale和mysql跨库查询_Oracle如何实现跨库查询
- 台式计算机如何取消屏幕密码,台式电脑怎么取消锁屏?
- 文件没保存怎么恢复?试试这个方法恢复数据
- 宝可梦 序列号认证服务器发生了错误,宝可梦探险寻宝无法连接服务器是什么原因...
- 汉子转五笔SQL脚本函数
- [球体积交]Girlfriend 2021牛客多校第2场 F
- 信号的宽带和计算机网络的宽带有什么不同,计算机网络(一)带宽理解
- 论文精读: MapReduce
- 利用fullpage插件,快速开发整屏翻页的页面
- VS中C++导入并使用DLL文件使用步骤
热门文章
- py2neo 基本用法
- webpack打包vue反编译_2020年你必须知道的webpack打包优化方法
- 页面文件太小无法完成操作_手机上也能轻松完成文件压缩操作,无需软件,可惜知道的人才10%...
- mac安装opencv
- python笔记 xpinyin
- 扒一扒搜索引擎是如何工作的?
- 对数线性模型之一(逻辑回归), 广义线性模型学习总结
- 朴素贝叶斯(NaiveBayes)算法总结
- android 9patch 漏洞,Android 9patch 图片解析堆溢出漏洞分析(CVE-2015-1532)
- python 柱状图宽度设置_Python matplotlib 柱状图实例