原文地址: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. Asp.net MVC的ViewData与ViewBag以及TemplateData的使用与区别

    ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才有 基于Asp.net 3.5 fram ...

  2. 10个常见的Node.js面试题

    如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...

  3. PostgreSQL

    PostgreSQL新手入门   作者: 阮一峰 日期: 2013年12月22日 自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQ ...

  4. svn error

    svn: E205009: Local, non-commit operations do not take a log message or revision properties svn copy ...

  5. 【原】作为前端需要了解的B/S架构

    其实B/S架构是属于后台方面的东西,不过作为一个前端,也是需要了解一下滴 C/S架构简要介绍 在了解什么是B/S架构之前,我们有必要了解一下什么是C/S架构: C/S架构是第一种比较早的软件架构,主要 ...

  6. 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数

    在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...

  7. JavaScript 最简单的图片切换

    使用前在文件外部要有1.jpg 2.jpg 只是简单的模仿flash图片切换,可在此基础上引申出各种不同的效果. 思路: 建立一个数组存放图片的src,然后调用setInterval周期性的调用cha ...

  8. [Java] JSP笔记 - EL、JSTL 常用标签

    一. 什么是 EL 语言 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语言. 二.EL 语言的作用 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMASc ...

  9. [.net core]简介(转)

    原文地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/ NET Core 是一个通用开发平台,由 Microsoft 和 GitHub  ...

  10. Git on Windows 一些问题

    问题汇总 1. 卸载Git时,bin和usr目录删不掉 报错:bin, usr目前需要admin权限删除,或者这个目录被其他文件引用 打开taskmgr,找到所有引用 git/bin/ 下的文件的进程 ...