代理主要有静态代理和动态代理。

静态代理:在代理中实现接口并创建实现类对象,在对实现类的方法增加功能(不常用)。

动态代理:实现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的工作模式的更多相关文章

  1. ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式

    Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...

  2. 实战Java虚拟机之二“虚拟机的工作模式”

    今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...

  3. 2.2 ARM处理器工作模式

    ARM Architecture Reference Manual Arm 指令框架手册 种工作模式 Processor mode Mode number Description User usr 0 ...

  4. apache 的工作模式

    总结:访问量大的时候使用 worker模式:  每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...

  5. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...

  6. apache查看工作模式及调优

    一,查看工作模式 /usr/sbin/httpd -l Compiled in modules:  core.c  prefork.c  http_core.c  mod_so.c 如果出现prefo ...

  7. apache工作模式:prefork和worker

    apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...

  8. (转载)关于Apache 的两种工作模式

    今天在查看服务器的时候,发现服务器http请求数 每天增长越来越多,在优化集群服务器的时候,查看到Apache 的工作模式是prefork,于是想到了worker 模式, 想暂时的把当前运行模式改成w ...

  9. VMWare提供了三种工作模式上网

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

随机推荐

  1. js和php的时间戳和时间的转化

    js时间戳转化为时间 //时间戳转时间 function time(sj) { var now = new Date(sj*1000); var year =now.getFullYear(); va ...

  2. Gmail登录(2017.10)

    本文地址:http://www.cnblogs.com/veinyin/p/7646382.html  由于众所周知的原因,我们使用 Gmail 查看邮件时会有些麻烦,有时梯子不够用甚至不能查看. 比 ...

  3. 【洛谷 P3227】 [HNOI2013]切糕(最小割)

    题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...

  4. c++树,知道前序和中序求后序遍历

    经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依 ...

  5. 41、用Python实现一个二分查找的函数

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset ...

  6. sg函数&&子状态的讨论

    题目链接:https://cn.vjudge.net/contest/269933#problem/H 具体思路:首先,这是一个公平的比赛,并且是两个人参与,两个人都足够聪明,并且可以通过有限步结束比 ...

  7. JS 判断手机操作系统代码

    还是利用UA, 返回值: ios, android, unknown function getMobileType () { var ua = window.navigator.userAgent.t ...

  8. oracle imp dmp命令

    vi par.txt userid=system/oracle tables=(user.table,...) query="where org_no like 32%" file ...

  9. kernel随机生成MAC地址的接口

    /**  * eth_random_addr - Generate software assigned random Ethernet address * @addr: Pointer to a si ...

  10. 有关mysql的innodb_flush_log_at_trx_commit参数【转】

    一.参数解释 0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下在事务提交的时候,不会主动触发写入磁盘的操作. 1:每次事务 ...