代理模式 是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. JavaScript数据类型(转)

    JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String.还有1种复杂数据类型——Object,Object本质上是由一 ...

  2. 使用photoshop,把图片背景变成透明

    鄙人使用的是photoshop CS6,win7系统,好了废话不多说,我们开始吧 1.打开photoshop,选择一个要编辑的图片 2.在右下角的图层面板上用鼠标左键快速双击背景图层为图片解锁 3.在 ...

  3. Bootstrap页面布局16 - BS导航菜单和其响应式布局以及导航中的下拉菜单

    代码: <div class='container-fluid'> <h2 class='page-header'>导航</h2> <!-- .navrbar ...

  4. REST性能测试方案

    1.REST简介 REST(代表性状态传输,Representational State Transfer)是一种Web服务设计模型.REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为 ...

  5. w_all_checked - js -checkbox 多选、全选、submit、request

    <!doctype html> <html> <head> <meta charset="UTF-8"> </head> ...

  6. Flink DataStream API Programming Guide

    Example Program The following program is a complete, working example of streaming window word count ...

  7. kafka监控系统

    Metrics-Java版的指标度量工具之一 Metrics-Java版的指标度量工具之二 JAVA Metrics 度量工具使用介绍1 JAVA Metrics度量工具 - Metrics Core ...

  8. (转)面试题--JAVA中静态块、静态变量加载顺序详解

    public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...

  9. mysql基本sql语句大全(基础用语篇)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  10. [LeetCode]题解(python):043-Multiply Strings

    题目来源 https://leetcode.com/problems/multiply-strings/ Given two numbers represented as strings, retur ...