Cglib代理

目标对象:
package com.bj.daili;

public class UserServiceImpl {

    public final void saveUser(String username, String password) {
        System.out.println("保存用户【"+username+"】,密码是【"+password+"】");
    }

    public void updateUser(String username, String password) {
        System.out.println("更新用户【"+username+"】,密码是【"+password+"】");
    }

    public void deleteUser(String username) {
        System.out.println("删除用户【"+username+"】");
    }

    public String findUser() {
        System.out.println("查询用户,返回王老五");
        return "王老五";
    }

}

代理对象:
package com.bj.daili;

import java.lang.reflect.Method;

import org.springframework.cglib.core.Signature;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {

    //定义一个目标对象
    Object targetObject;

    public Object createProxyObject(Object targetObject) {
        this.targetObject = targetObject;
        //如何根据目标对象创建的cglib的代理对象呢?

        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(this.targetObject.getClass().getClassLoader());
        enhancer.setSuperclass(this.targetObject.getClass());
        enhancer.setCallback(this);
        //创建cglib代理
        return enhancer.create();
    }

    /**
     * intercept:在访问目标对象之前先执行代理对象
     *   * Object proxy:代理对象
     *   * Method method:代理对象中执行的方法(目标的对象的方法对象)
     *   * Object[] args:方法中的参数
     *   * MethodProxy:方法的代理对象
     *   * 返回值Ojbect:可以指定目标对象方法的放回值
     * */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {
        if(method.getName()!=null && method.getName().contains("save") || method.getName().contains("update")){
            security();//执行校验
            System.out.println("代理对象的类:"+proxy.getClass());
            System.out.println("代理对象或目标对象的方法名称:"+method.getName());
            if(args!=null && args.length>0){
                for(Object o:args){
                    System.out.println("调用目标对象的方法参数:"+o);
                }
            }
        }
        //获取目标对象方法信息
        Signature signature = methodProxy.getSignature();
        System.out.println(signature.getName()+"   "+signature.getArgumentTypes()+"   "+signature.getReturnType());
        /**
         * method.invoke:调用目标对象
         * 参数一:目标对象
         * 参数二:调用目标对象的方法参数
         * 返回Object:调用目标对象的方法的返回值
         */
        Object o = method.invoke(targetObject, args);
        //如果返回null,客户端调用目标对象之后就都为null
        return o;
    }

    //校验
    public void security(){
        System.out.println("开始执行校验...。校验结束");
    }

}
  测试:
package com.bj.daili;

public class App {

    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        //使用createProxyObject的方法,传递目标对象,返回代理对象
        UserServiceImpl userService = (UserServiceImpl) cglibProxy.createProxyObject(new UserServiceImpl());

        userService.saveUser("李小四", "123");
        userService.updateUser("李小四", "123");
        userService.deleteUser("李小四");
        String value = userService.findUser();
        System.out.println("value:"+value);
    }
}
时间: 2024-10-18 00:43:39

Cglib代理的相关文章

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

谈谈java的代理模式认识 三————CGLIB代理

接着上篇博客的代理模式,我们继续,上篇博客介绍了JDK的动态代理,但是JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,这样就存在一定的局限性.对于这种情况,我们采用CGLIB来实现. 一.CGLIB动态代理 cglib是针对类来实现代理的,其实现原理:CGLIB的底层采用ASM字节码生成框架,使用字节码技术生成代理,比使用反射生成代理的效果要高,是对指定的目标类生成一个子类,并覆盖其中方法实现增强.但是也有一点点不足,因为采用的是继承,所以不能对fina

(转)Java动态代理与CGLib代理

本文通过spring aop的代理实现简述了java动态代理和cglib的区别,有助于理解java的代理模式 转载自:http://www.iteye.com/topic/182654 Java代码 <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        // TODO Auto-generated method stub <br>        Sys

spring 代理(静态代理&amp;动态代理&amp;cglib代理)

介绍spring AOP之前 先介绍三种常见的代理方式:静态代理,动态代理,cglib代理 代理概述: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象.这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 举例:明星(邓紫棋)<------经纪人<-------用户 目标        (代理) 一.静态代理 1)代理的对象要实现与目标对象一样的接口 2)举例:保存用户(模拟) Dao,直接保存 DaoProxy,给保存

Spring《八-一》CGLIB代理和自动代理

CGLIB代理 配置文档 1 <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 2 <property name="proxyTargetClass"> 3 <value>true</value> 4 </property> 5 <property name="t

jdk动态代理与cglib代理、spring aop代理实现原理解析

原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 动态代理实现主要有2种形式,主要分为: 1.jdk动态代理: 1)原理:是根据类加载器和接口创建代理类(此代理类是接口的实现类,所以必须使用接口 面向接口生成代理,位于java.lang.reflect包下) 2)实现方式: 1. 通过实现Invocati

jdk动态代理和cglib代理总结

首先我们来谈谈jdk的动态代理,它允许开发者在运行期创建接口的代理实例,那么当我们在运行过程中调用某个实例的某个方法时,可以使用代理对象去具体实现它,从而达到aop的效果. (1)jdk的动态代理主要涉及两个类:proxy和invocacationHandler,invocationHandler里面包含了横切逻辑,并且可以使用反射调用目标类的方法(就是切点),proxy类主要是使用它的一个newinstance方法去创建一个代理实例. 下面我们来看代码: package com.yue.tes

cglib 代理

cglib 代理 什么是cglib?   一段介绍是这样的:       CGLIB(Code Generation Library)是一个开源项目!       是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.       CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.       Spring AOP和Hibernate同时使用JDK的动态代理和CGLIB包. cglib 代理特点: CGLIB 是针对

基于Spring AOP的JDK动态代理和CGLIB代理

一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 二.主要用途 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务