首页 > 其他分享 >10_Spring_CGLIB动态代理

10_Spring_CGLIB动态代理

时间:2023-03-02 21:46:29浏览次数:41  
标签:10 Spring Object public Person CGLIB import 父类 eat

 proxy 动态代理
面向接口
1必须有接口和实现类  
2增强接口中定义的方法
3只能读取接口中方法的上注解

cglib动态代理模式
面向父类

 

package com.msb.testCglib;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 {
    @Test
    public void testCglib(){
        Person person =new Person();
        // 获取一个Person的代理对象
        // 1 获得一个Enhancer对象
        Enhancer enhancer=new Enhancer();
        // 2 设置父类字节码
        enhancer.setSuperclass(person.getClass());
        // 3 获取MethodIntercepter对象 用于定义增强规则
        MethodInterceptor methodInterceptor=new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                /*Object o,  生成之后的代理对象 personProxy
                Method method,  父类中原本要执行的方法  Person>>> eat()
                Object[] objects, 方法在调用时传入的实参数组
                MethodProxy methodProxy  子类中重写父类的方法 personProxy >>> eat()
                */
                Object res =null;
                if(method.getName().equals("eat")){
                    // 如果是eat方法 则增强并运行
                    System.out.println("饭前洗手");
                    res=methodProxy.invokeSuper(o,objects);
                    System.out.println("饭后刷碗");
                }else{
                    // 如果是其他方法 不增强运行
                    res=methodProxy.invokeSuper(o,objects); // 子类对象方法在执行,默认会调用父类对应被重写的方法
                }
                return res;
            }
        };
        // 4 设置methodInterceptor
        enhancer.setCallback(methodInterceptor);
        // 5 获得代理对象
        Person personProxy = (Person)enhancer.create();
        // 6 使用代理对象完成功能
        personProxy.eat("包子");
    }
}
class Person  {
    public Person( ) {
    }
    public void eat(String foodName) {
        System.out.println("张三正在吃"+foodName);
    }
}

 

 

标签:10,Spring,Object,public,Person,CGLIB,import,父类,eat
From: https://www.cnblogs.com/2324hh/p/17173644.html

相关文章

  • 6_Spring_Bean的自动装配
    ​ bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packageco......
  • 6_Spring_Bean的自动装配
    ​ bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packageco......
  • Spring 为解决应用开发的复杂性而生
    课程简介和目标是一个开源框架,它由RodJohnson创建,.它是一个容器框架,用来装javabean,这种中间层框架可以起一个连接作用,比如说把Struts和hibernate结合在一起运用,就是早......
  • 3_Spring_IOC原理分析_重要
    ​ IOC底层原理 1XML解析技术读取配置文件 <beanid="empDao"class="com.msb.dao.impl.EmpDaoImpl"></bean> 将上面的信息读取进入程序 对象的ID,一个......
  • [oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc
    个人计算机浪潮回忆上次内容个人电脑(PC)在爱好者之间疯传人人都有一台计算机从attair-8800到apple-1个人电脑离普通人更近了如果人人都有自己的电脑谁还去用终端连......
  • pat 乙级1024 科学计数法关于stl中size()的一些思考即测试点六,无符号整数问题
    来,先看题目:1024科学计数法分数20作者HOU,Qiming单位浙江大学科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9].[0-9]+......
  • pat乙级 1019 数字黑洞
    #include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>voiddecline(inta[]){inttemp=0;for(inti=0;i<3;i++){......
  • springMVC全注解开发
    消除springmvc.xml创建配置类@Configuration@ComponentScan({"com.java.service","com.java.web.controller"})@EnableWebMvc//<mvc:annotation-driven/><mvc:defaul......
  • 10个实用技巧:如何让你的外贸独立站排名直线上升
    在当今竞争激烈的互联网市场中,谷歌SEO已经成为了外贸独立站排名提升的必修课程。为了使得自己的网站能够在谷歌上排名更高,网站优化的工作显得尤为重要。在这篇文章中,我们将......
  • Win10右键菜单添加“获取文件管理员权限”选项
    删除移动文件时:文件访问被拒绝,你需要Administrator提供的权限才能对此文件进行更改/文件访问被拒绝,你需要权限才能执行此操作/你需要提供管理员权限才能移动此文件右键添......