基于接口和基于子类的动态代理

一:基于接口(JDK1.3之后提供):

import com.aiitec.service.IAccountService;import com.aiitec.utils.TransactionManager;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;
public class AccountServiceFactory {    @Autowired    @Qualifier("accountService")    private IAccountService service;//被代理对象,必须实现至少一个接口

    @Autowired    private TransactionManager transactionManager;//事务控制器

  
/** * 获取代理对象 * @return */
    public IAccountService getProxy() {        return (IAccountService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                Object result=null;                try{                    transactionManager.beginTransaction();                    System.out.println("前置通知生效。。。");

                    result=method.invoke(service,args);

                    transactionManager.commit();                    System.out.println("后置通知生效。。。");                }catch (Exception e){                    transactionManager.rollback();                    System.out.println("异常通知生效。。。");                    throw new RuntimeException(e);                }finally {                    transactionManager.relese();                    System.out.println("最终通知生效。。。");                }                return result;            }        });    }}

配置spring的IOC:
<!--配置基于接口的动态代理对象,工厂方法创建--><bean id="serviceProxy" factory-bean="accountServiceFactory" factory-method="getProxy"></bean>

<bean id="accountServiceFactory" class="com.aiitec.proxy.AccountServiceFactory"></bean>

使用:
    @Autowired    @Qualifier("serviceProxy")    private IAccountService ccountService;

一:基于子类(第三方Cglib提供):先导包
<!--cglib基于子类的动态代理--><dependency>  <groupId>cglib</groupId>  <artifactId>cglib</artifactId>  <version>2.1_3</version></dependency>
 
import com.aiitec.service.impl.AccountServiceCglib;import com.aiitec.utils.TransactionManager;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

public class AccountServiceCglibFactory {    @Autowired    private AccountServiceCglib accountServiceCglib;//被代理对象,必须不是final类

    @Autowired    private TransactionManager transactionManager;
/** * 获取代理对象 * @return */
    public AccountServiceCglib getProxy() {        return (AccountServiceCglib) Enhancer.create(accountServiceCglib.getClass(), new MethodInterceptor() {            @Override            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {                Object result=null;                try{                    transactionManager.beginTransaction();                    System.out.println("cglib前置通知生效。。。");                    result=method.invoke(accountServiceCglib,args);                    transactionManager.commit();                    System.out.println("cglib后置通知生效。。。");                }catch (Exception e){                    transactionManager.rollback();                    System.out.println("cglib异常通知生效。。。");                    throw new RuntimeException(e);                }finally {                    transactionManager.relese();                    System.out.println("cglib最终通知生效。。。");                }                return result;            }        });    }}
配置spring的IOC:
<!--配置基于子类的动态代理对象,工厂方法创建-->
<bean id="serviceCglib" factory-bean="accountCglibFactory" factory-method="getProxy"></bean><bean id="accountCglibFactory" class="com.aiitec.proxy.AccountServiceCglibFactory"></bean>

使用:
@Autowired@Qualifier("serviceCglib")private AccountServiceCglib serviceCglibProxy;

原文地址:https://www.cnblogs.com/zou-rong/p/12001345.html

时间: 2024-10-26 02:42:39

基于接口和基于子类的动态代理的相关文章

基于子类的动态代理

package com.itheima.cglib; import com.itheima.proxy.IProducer;import com.itheima.proxy.Producer;import com.sun.webkit.dom.ProcessingInstructionImpl;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.pro

阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理

代理一个普通的java类 导入cglib的包 它还有一个asm的依赖.会自动加进来 创建cglib的文件夹.把proxy里面的Client和Producer复制到cglib文件夹 Producer不实现任何的接口 Client内的代码要重新写 不能受罪种类,如果是最终类就不能再创建子类了 参数1是Class 参数2是Callback MethodInterceptor是Callback的子接口 前面三个参数和基于接口的动态代码参数是一样的 producer需要用final来修饰 调用一下这个方法

动态代理是基于什么原理(总结杨晓峰的博客)

动态代理的原理 编程语言分为:动态类型,静态类型 动态类型和静态类型的区别? 一种比较简单的区别方法:是在编译期进行检查,还是在运行时期进行检查. 通常认为:java是一种强类型语言,但是提供类似反射的机制,也具备部分动态语言的能力. 反射机制是java语言提供的一种基础功能,赋予程序在运行时自省(introspect能力),通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性或者方法,调用方法或者构造对象,甚至可以运行时修改类定义. 动态代理是一种方便运行时动态构建代

Java开发纯接口的动态代理

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 相关类及接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象.// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器static InvocationHandler getInvocationHandler(Object pr

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

Java中的动态代理以及Proxy类的偷瞄

动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包下,主要涉及到两个类. (1)接口InvocationHandler:该接口中仅定义了一个方法. Object invoke(Object obj, Method method, Object[] args); 在实际使用时,第一个参数obj一般指代理类,method是被代理的方法,args为该方法

动态代理3--Spring AOP分析

Spring AOP的基本实现方式 ?Spring AOP,一种模块化机制,能够动态的对切点添加行为,而不破坏原有的代码结构. 这是一个非常好地动态代理的应用方式.Spring AOP实现依赖于JDK的动态代理库和CGLIB字节码库技术两种来分别实现. ?在Spring AOP中,JdkDynamicAopProxy实现基于JDK动态代理生成代理对象,CglibAopProxy来实现基于CGLIB的动态代理对象生成.并通过DefaultAopProxyFactory进行调用.此处採用策略模式.针

CGLib与JDK的动态代理

一.CGLib 简介 CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口.Hibernate用它来实现PO字节码的动态生成.CGLib比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法. CGLib 的底层是Java字节码操作框架 -- ASM.CGLib就是封装了ASM,简化了ASM的操作,实现了在运行期动态生