代理模式 是spring AOP机制的实现基础,有必要学习一下。

有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。

先看一组代码,

package com.sinosoft.proxy;

public interface UserInterface {

    public abstract void add();
public abstract void delete(); } package com.sinosoft.proxy; public class UserInterfaceImpl implements UserInterface{ @Override
public void add() {
System.out.println("add add add"); } @Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("delete delete delete");
} }

输出结果如下,

现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
该怎么做?
我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
由代理对象来完成该功能。

第一,JDK动态代理方式

package com.sinosoft.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class ProxyFactory implements InvocationHandler{
private Object target; private ProxyFactory(){} public static ProxyFactory getInstance(){ //Runtime
return new ProxyFactory();
} public Object getProxy(Class clazz){
Object proxy=Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
return proxy; } @Override
public Object invoke(Object object, Method method, Object[] params)
throws Throwable {
// TODO Auto-generated method stub
Object retVal=null;
try {
System.out.println("before....");
retVal=method.invoke(target, params);
System.out.println("ater.....");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("exception.....");
}finally{
System.out.println("finally....");
}
return retVal;
}
} package com.sinosoft.proxy; import org.junit.Test; public class ProxyTest {
@Test //public static void main(String[] args) {
public void test1(){ UserInterfaceImpl userimpl=new UserInterfaceImpl();
userimpl.add();
userimpl.delete();
} //} @Test
public void test2(){
ProxyFactory factory=ProxyFactory.getInstance(); UserInterface userinterface=(UserInterface)factory.getProxy(new UserInterfaceImpl().getClass()); System.out.println(userinterface.getClass());
userinterface.add();
userinterface.delete(); } }

基于jdk proxy的动态代理模式的更多相关文章

  1. 设计模式(八)Dynamic Proxy Parttern 动态代理模式

    举例: jdk自带动态代理 javaassit字节码操作库实现 CGLIB ASM底层操作 实际例子: 使用jdk自带动态代理 java.lang.reflect.Proxy 作用 动态生成代理类和对 ...

  2. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  3. java jdk动态代理模式举例浅析

    代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...

  4. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  5. 代理模式(Proxy)--动态代理(CGLIB)

    上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...

  6. Spring代理模式(jdk动态代理模式)

    有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...

  7. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

  8. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  9. 基于 CGLIB 库的动态代理机制

    之前的文章我们详细的介绍了 JDK 自身的 API 所提供的一种动态代理的实现,它的实现相对而言是简单的,但是却有一个非常致命性的缺陷,就是只能为接口中的方法完成代理,而委托类自己的方法或者父类中的方 ...

随机推荐

  1. java web基础1Tomcat服务器基本知识

    一.Tomcat安装 (1)先安装JDK,并配置环境变量JAVA_HOME.Tomcat服务器的配置需要JDK的JAVA_HOME环境变量. 并在系统path变量添加%JAVA_HOME%/bin. ...

  2. 20145235 《Java程序设计》第9周学习总结

    第十六章 整合数据库 JDBC Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Ja ...

  3. Centos tar命令

    打包文件同时压缩 tar -zcvf /file.tar.gz /directoryname

  4. DefaultHttpClient使用

    转自:http://username2.iteye.com/blog/1664995 博客分类:  java 工具类 javaio  ]; } json = JSONObject.fromObject ...

  5. java Conditions

    //Listing 7-2. Achieving Synchronization in Terms of Locks and Conditions import java.util.concurren ...

  6. 蓝牙的Baseband说明

    蓝牙的radio部分使用2.4GHz的ISM段,2400 - 2483.5 MHz,通道间隔1MHz,GFS调制,采用跳频技术,每秒至少1600次.连接完成后的跳频次数为1600次/s,在inquir ...

  7. PE文件格式图示

  8. java 发送http json请求

    public void getRemoteId(HttpServletRequest request,Model model){ String name = request.getParameter( ...

  9. A+Bproblem

    package A+Bproblem; /* * A+B Problem 时间限制:3000 ms  |  内存限制:65535 KB 难度:0 描述 此题为练手用题,请大家计算一下a+b的值 输入 ...

  10. iOS Node Conflict svn冲突

    当出现这个冲突时,应该是我add的文件,和同事处理的方法有冲突导致的. 这个的解决办法是:先revert这个文件,然后再update.