• java之CGLIB动态代理


    © 版权声明:本文为博主原创文章,转载请注明出处

    CGLIB动态代理:

      CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强

    优势:

      - 1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性

      - 2. 只需一个动态代理类就可以代理很多类,大大减少了代理类的规模,便于维护

      - 3. 接口变了,动态代理类也不需要任何改动

      - 4. 可以代理没有实现任何一个接口的类

    劣势:

      - 1. 不可以对final修饰的类或方法进行代理

    实例:

    1.项目结构

    2.pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      
      	<modelVersion>4.0.0</modelVersion>
    
    	<groupId>org.proxy</groupId>
    	<artifactId>DynamicProxy-CGlib</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    	</properties>
    
    	<dependencies>
    		<!-- Junit -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    			<scope>test</scope>
    		</dependency>
    		<!-- CGLIB -->
    		<dependency>
    		    <groupId>cglib</groupId>
    		    <artifactId>cglib</artifactId>
    		    <version>3.2.5</version>
    		</dependency>
    	</dependencies>
    	
    </project>

    3.Hello.java

    package org.proxy.DynamicProxy_CGlib;
    
    public class Hello {
        
    	public void say(String name) {
    		
    		System.out.println("Hello!" + name);
    		
    	}
    	
    }

    4.CGLibProxy.java

    package org.proxy.DynamicProxy_CGlib;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class CGLibProxy implements MethodInterceptor {
    
    	private static CGLibProxy instance = new CGLibProxy();
    	
    	private CGLibProxy() {
    	
    	}
    	
    	public static CGLibProxy getInstance() {
    		
    		return instance;
    		
    	}
    	
    	@SuppressWarnings("unchecked")
    	public <T> T getProxy(Class<T> cls) {
    		
    		return (T) Enhancer.create(cls, this);
    		
    	}
    	
    	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    		
    		before();
    		Object result = proxy.invokeSuper(obj, args);
    		after();
    		return result;
    		
    	}
    	
    	private void before() {
    		
    		System.out.println("Before");
    		
    	}
    	
    	private void after() {
    		
    		System.out.println("After");
    		
    	}
    
    }

    5.TestCGLibDynamicProxy.java

    package org.proxy.test;
    
    import org.junit.Test;
    import org.proxy.DynamicProxy_CGlib.CGLibProxy;
    import org.proxy.DynamicProxy_CGlib.Hello;
    
    public class TestCGLibDynamicProxy  {
    	
    	@Test
    	public void testHello() {
    		
    		Hello helloProxy = CGLibProxy.getInstance().getProxy(Hello.class);
    		helloProxy.say("Jack");
    		
    	}
    	
    }

    6.效果预览

    参考:《架构探险-从零开始写Java Web框架》(黄勇著)

  • 相关阅读:
    腾讯云搭建web环境基础指导
    php正则表达式填坑
    微信小程序新手填坑
    如何优雅的扒网站——工具篇
    两个常见的前端问题:如何让分页码居中显示 及 解决浮动元素覆盖的问题
    非常全面的PHP header函数设置HTTP头的示例
    Nginx + fastcgi + php 的原理与关系
    Linux命令之 tar
    数据结构和算法
    单例模式
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/6933362.html
Copyright © 2020-2023  润新知