原文地址:http://blog.csdn.net/partner4java/article/details/7048879

静态AOP和动态AOP。

静态代理: 
代理对象与被代理对象必须实现同一个接口。 
demo:

  1. package cn.partner4java.proxy.staticproxy;
  2. /**
  3. * 静态代理,统一接口
  4. * @author partner4java
  5. *
  6. */
  7. public interface IHello {
  8. /**
  9. * 可以带来的统一方法
  10. * @param name
  11. */
  12. public void hello(String name);
  13. }
  1. package cn.partner4java.proxy.staticproxy;
  2. /**
  3. * 被代理的对象,需要借助代理对象加入日志
  4. * @author partner4java
  5. *
  6. */
  7. public class HelloSpeaker implements IHello {
  8. public void hello(String name) {
  9. System.out.println("Hello " + name);
  10. }
  11. }
  1. package cn.partner4java.proxy.staticproxy;
  2. /**
  3. * 代理对象,给被代理对象添加日志
  4. */
  5. public class HelloProxy implements IHello {
  6. private IHello iHello;
  7. public HelloProxy(IHello iHello) {
  8. super();
  9. this.iHello = iHello;
  10. }
  11. public void hello(String name) {
  12. System.out.println("记录日志");
  13. iHello.hello(name);
  14. }
  15. }
  1. package cn.partner4java.proxy.staticproxy;
  2. /**
  3. * 调用
  4. * @author partner4java
  5. *
  6. */
  7. public class ProxyDemo {
  8. public static void main(String[] args) {
  9. IHello iHello = new HelloProxy(new HelloSpeaker());
  10. iHello.hello("long");
  11. }
  12. }

动态代理: 
动态代理区别于静态带来实现的地方在于织入过程是在运行时动态进行的。自己实现一般实现java.lang.reflect.InvocationHandler接口。 
例子:

  1. package cn.partner4java.proxy.dynamicproxy;
  2. public interface IHello {
  3. public void hello(String name);
  4. }
  1. package cn.partner4java.proxy.dynamicproxy;
  2. /**
  3. * 被代理的对象,需要借助代理对象加入日志
  4. * @author partner4java
  5. *
  6. */
  7. public class HelloSpeaker implements IHello {
  8. public void hello(String name) {
  9. System.out.println("Hello " + name);
  10. }
  11. }
  1. package cn.partner4java.proxy.dynamicproxy;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. /**
  6. * 动态代理对象
  7. * @author partner4java
  8. *
  9. */
  10. public class LogHandler implements InvocationHandler {
  11. private Object delegate;
  12. public Object bind(Object delegate){
  13. this.delegate = delegate;
  14. return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
  15. delegate.getClass().getInterfaces(), this);
  16. }
  17. /**
  18. * 代理对象,这里面还可以改变原有的方法
  19. */
  20. public Object invoke(Object proxy, Method method, Object[] args)
  21. throws Throwable {
  22. Object result = null;
  23. try {
  24. System.out.println("添加日志");
  25. result = method.invoke(delegate, args);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return null;
  30. }
  31. }
  1. package cn.partner4java.proxy.dynamicproxy;
  2. /**
  3. * 测试
  4. * @author partner4java
  5. *
  6. */
  7. public class ProxyDemo {
  8. public static void main(String[] args) {
  9. LogHandler logHandler = new LogHandler();
  10. IHello iHello = (IHello) logHandler.bind(new HelloSpeaker());
  11. iHello.hello("long");
  12. }
  13. }

------------------------------------------------------------------

利用ProxyFactory连接CGLIB简单实现AOP: 
加入包aopalliance.jar\cglib-nodep-2.1_3.jar 
demo:

  1. package cn.partner4java.proxy.proxyfactory;
  2. /**
  3. * 被代理的对象
  4. * @author partner4java
  5. *
  6. */
  7. public class MessageWriter {
  8. public void writeMessage(){
  9. System.out.println("world!");
  10. }
  11. }
  1. package cn.partner4java.proxy.proxyfactory;
  2. import org.aopalliance.intercept.MethodInterceptor;
  3. import org.aopalliance.intercept.MethodInvocation;
  4. /**
  5. * 装饰者<br/>
  6. * MethodInterceptor接口是对方法调用连接点实现包围通知的AOP联盟标准接口
  7. * @author partner4java
  8. *
  9. */
  10. public class MessageDecorator implements MethodInterceptor{
  11. public Object invoke(MethodInvocation invocation) throws Throwable {
  12. System.out.print("Hello ");
  13. Object retVal = invocation.proceed();
  14. return retVal;
  15. }
  16. }
  1. package cn.partner4java.proxy.proxyfactory;
  2. import org.springframework.aop.framework.ProxyFactory;
  3. /**
  4. * 调用组装
  5. * 这里最重要的部分是我们使用ProxyFactory来创建一个目标对象代理,同时织入通知
  6. * @author partner4java
  7. *
  8. */
  9. public class HelloWorldWeaver {
  10. public static void main(String[] args) {
  11. //目标
  12. MessageWriter target = new MessageWriter();
  13. //create the proxy
  14. ProxyFactory proxyFactory = new ProxyFactory();
  15. proxyFactory.addAdvice(new MessageDecorator());
  16. proxyFactory.setTarget(target);
  17. //获取返回被代理的目标
  18. MessageWriter proxy = (MessageWriter) proxyFactory.getProxy();
  19. target.writeMessage();
  20. System.out.println("---");
  21. proxy.writeMessage();
  22. //      后台打印:
  23. //      world!
  24. //      ---
  25. //      World world!
  26. }
  27. }

静态代理&动态代理的更多相关文章

  1. java静态和动态代理原理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  2. 【SSH系列】静态代理&&动态代理

    从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: ...

  3. 静态代理,动态代理,Cglib代理详解

    一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc; public interface Iplayer { public vo ...

  4. 8、Spring教程之静态代理/动态代理

    为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 学习aop之前 , 我们要先了解一下代理模式! 静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象 ...

  5. 轻松理解 Java 静态代理/动态代理

    目录 什么是代理模式 定义 代理模式的主要角色 优点 缺点 静态代理 动态代理 JDK原生动态代理 例子 分析 小结 CGLIB动态代理 例子 分析 final类型 其他方案 尾声 理解Java动态代 ...

  6. Java 的静态代理 动态代理(JDK和cglib)

    转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...

  7. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  8. 啰里吧嗦式讲解java静态代理动态代理模式

    一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...

  9. spring aop,静态及动态代理例子

    @Aspect@Componentpublic class AopText { @Pointcut("execution(public * com.llf.service.*Service. ...

随机推荐

  1. [Reproduced works]MongoDB Unauthorized Access Vulnerability

    mongodb未授权访问漏洞 catalogue 1. mongodb安装 2. 未授权访问漏洞 3. 漏洞修复及加固 4. 自动化检测点 1. mongodb安装 apt-get install m ...

  2. 如何在mac本上安装android sdk 避免被墙

    众所周知的原因,google的很多网站在国内无法访问,苦逼了一堆天朝程序员,下是在mac本上折腾android 开发环境的过程: 一.先下载android sdk for mac 给二个靠谱的网址: ...

  3. My97 DatePicker 日期选择插件.

    My97DatePicker是一个纯js写的时间插件,体积较小,更可以自己扩展皮肤,且样式不和页面相冲突,有多钟配置,近期项目用了一下感觉还不错...分享给大家 软件官网:http://www.my9 ...

  4. pandas read table

    http://pandas.pydata.org/pandas-docs/stable/10min.html import pandas as pd res = pd.read_table(" ...

  5. Spring MVC学习笔记——SiteMesh的使用(转)

    转自 SiteMesh的使用 SiteMesh的介绍就不多说了,主要是用来统一页面风格,减少重复编码的. 它定义了一个过滤器,然后把页面都加上统一的头部和底部. 需要先在WEB-INF/lib下引入s ...

  6. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  7. sublime 中 pyv8 binary 报错怎么处理?

    ,sublime text 在安装插件的时候,尤其是Emmet的时候,经常会报一个错误--please wait a bit whilePyV8 binary is being downloaded, ...

  8. C语言创建及解析Json的使用法则

    参考原文:http://blog.csdn.net/xukai871105/article/details/33013455 JSON(JavaScriptObject Notation)是一种轻量级 ...

  9. 什么是License

    许多混乱就始于你不知道License到底是什么,到底有什么含义.当你对你的产品使用License时,并不意味着你放弃了任何权利,你依然对其拥有原著作权.License只是授予他们于特定权利来使用你的产 ...

  10. Sql Server 学习链接

    避免SQL全表查询:http://www.dedecms.com/knowledge/data-base/sql-server/2012/0821/11698.html?jdfwkey=n3nuq