AOP的工作模式
代理主要有静态代理和动态代理。
静态代理:在代理中实现接口并创建实现类对象,在对实现类的方法增加功能(不常用)。
动态代理:实现implements InvocationHandler接口。实现方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
System.out.println("=========");
Object o=method.invoke(this.ins, args);
System.out.println("---------");
return o;
}
流程图:在配置文件的配置
配置文件代码:
<!-- pointcut definition -->
<p:bean id="cf" class="com.kettas.spring.aop.day4.MyClassFilter">
<p:property name="classes">
<p:set>
<p:value>com.kettas.spring.ioc.day1.HelloIF</p:value> ---
</p:set>
</p:property>
</p:bean>
<p:bean id="mm" class="com.kettas.spring.aop.day4.MyMethodMatcher">
<p:property name="methodNames">
<p:set>
<p:value>sayHello</p:value>
</p:set>
</p:property>
</p:bean>
<p:bean id="pc" class="com.kettas.spring.aop.day4.MyPointcut">
<p:property name="classFilter" ref="cf"></p:property>
<p:property name="methodMatcher" ref="mm"></p:property>
</p:bean>
<!--advice 要继承implements MethodInterceptor-->
<p:bean id="timingAdvice" class="com.kettas.spring.aop.day4.TimingInterceptor"></p:bean>
<!-- advisor 把通知和切入点结合在一起- 最好给代理增加功能->
<p:bean id="timingAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<p:property name="advice" ref="timingAdvice"></p:property>
<p:property name="pointcut" ref="pc"></p:property>
</p:bean>
<!—target 目标 -->
<p:bean id="helloTarget" class="com.kettas.spring.ioc.day1.HelloIFImpl">
<p:property name="cal">
<p:bean class="java.util.GregorianCalendar"></p:bean>
</p:property>
<p:property name="user" value="world"></p:property>
</p:bean>
<!-- proxy -->
<p:bean id="hello" class="org.springframework.aop.framework.ProxyFactoryBean">
<p:property name="target" ref="helloTarget"></p:property>
<p:property name="interceptorNames">
<p:list>
<p:idref bean="timingAdvisor"/> 增加一种服务
<p:idref bean="xxxAdvisor"/> 增加另一种服务
</p:list>
</p:property>
<p:property name="proxyInterfaces"> 要和目标类实现共同的接口
<p:value>com.kettas.spring.ioc.day1.HelloIF</p:value>
</p:property>
</p:bean>
</p:beans>
简化配置:有可能只是目标类不一样,其他的都是一样的。解决每一个目标类都需要一个复杂的代理过程配置的问题,可以简化配置的问题 抽象ProxyFactoyBean的方法 如:
<!-- 抽象proxy --定义抽象的类,只是没有目标类,其他的通知和接口都一样>
<p:bean id="helloBase" class="org.springframework.aop.framework.ProxyFactoryBean" abstract=“true”>
<p:property name="interceptorNames">
<p:list>
<p:idref bean="timingAdvisor"/> 增加一种服务
<p:idref bean="xxxAdvisor"/> 增加另一种服务
</p:list>
</p:property>
<p:property name="proxyInterfaces"> 要和目标类实现共同的接口
<p:value>com.kettas.spring.ioc.day1.HelloIF</p:value>
</p:property>
</p:bean>
</p:beans>
真正的代理
<!—target 目标 继承抽象方法 只用写目标类就可以了 -->
<!-- proxy -->
<p:bean id="hello" parent=” helloBase”>
<p:property name="target" ref="helloTarget"></p:property>
</p:bean>
AOP的工作模式的更多相关文章
- ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式
Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...
- 实战Java虚拟机之二“虚拟机的工作模式”
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 2.2 ARM处理器工作模式
ARM Architecture Reference Manual Arm 指令框架手册 种工作模式 Processor mode Mode number Description User usr 0 ...
- apache 的工作模式
总结:访问量大的时候使用 worker模式: 每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...
- Apache常用2种工作模式prefork和worker比较
Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...
- apache查看工作模式及调优
一,查看工作模式 /usr/sbin/httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c 如果出现prefo ...
- apache工作模式:prefork和worker
apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...
- (转载)关于Apache 的两种工作模式
今天在查看服务器的时候,发现服务器http请求数 每天增长越来越多,在优化集群服务器的时候,查看到Apache 的工作模式是prefork,于是想到了worker 模式, 想暂时的把当前运行模式改成w ...
- VMWare提供了三种工作模式上网
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...
随机推荐
- Python学习笔记(三十三)常用内置模块(2)collections_namedtuple_deque_defaultdict_OrderedDict_Counter
摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431953239 ...
- asp.net DataTable导出 excel的方法记录(第三方)
官网:http://npoi.codeplex.com/ 简单应用,主要是可以实现我们想要的简单效果,呵呵 需要引入dll,可以在官网下载,也可在下面下载 protected void getExce ...
- 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
[题意]给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率.n<=300. [算法]概率+高斯消元 [题解]很直接的会考虑假设每个点爆炸的概率,无 ...
- CodeForces - 1016B
You are given two strings ss and tt, both consisting only of lowercase Latin letters. The substring ...
- 用create-react-app来快速配置react
最近在学react,然后感觉自己之前用的express+gulp+webpack+ejs的工作环境还是基于html+js+css这种三层架构的应用,完全跟react不是一回事. 愚蠢的我居然在原先的这 ...
- 选择问题(选择数组中第K小的数)
由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小 ...
- Python基础之杂货铺
字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-310 ...
- openjudge-NOI 2.6-1808 公共子序列
题目链接:http://noi.openjudge.cn/ch0206/1808/ 题解: 裸题…… #include<cstdio> #include<cstring> #d ...
- 用C++写程序的一些感悟
前言 近期使用C++有了一些心得很感悟,这里整理一下. 心得1 如果只会使用LabVIEW写程序,还想要进一步深入程序设计,一定要学习一门文本语言. 什么是会用LabVIEW 会用是个比较笼统的概念. ...
- 牛奶ddw如何通过以太坊钱包实现互相打赏
很多朋友不清楚如何转账ddw,但是万能的网友是无敌的,这两天就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击&quo ...