当前位置:首页 > CN2资讯 > 正文内容

springAOP(CGLIB代理)

2天前CN2资讯


Spring AOP----CGLIB代理

  • ​​1.为什么要有CGLIB代理​​
  • ​​2.CGLIB代理的原理​​
  • ​​3.例子​​
  • ​​3.1创建一个spring的项目​​
  • ​​3.2创建Java类​​
  • ​​3.3xml文件​​
  • ​​3.4运行结果​​
  • ​​4.总结​​

1.为什么要有CGLIB代理

spring实现的AOP中,jdk代理是通过java.lang.reflect.Proxy类实现的,调用newProxyInstance方法创建代理对象。但是jdk代理有一个致命的缺点,那就是代理的目标类必须至少实现一个接口,如果一个接口也没有实现,那么就会出现异常。
CGLIB代理正是可以解决这个问题,CGLIB代理没有实现任何接口的类。

2.CGLIB代理的原理

CGLIB代理的原理非常的简单:
CGLIB采用字节码技术,对目标类进行继承,生成目标类的子类,然后对子类进行增强,实现代理的目的。
spring核心包已经继承CGLIB。

3.例子

3.1创建一个spring的项目

3.2创建Java类

package bean;

public final class FinalPeople {

public void say(){
System.out.println("final People");
}

}
package bean;

public class People {

public void say(){
System.out.println("say");
}

}
package cglib;

import java.lang.reflect.Method;

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

public class MyCglib implements MethodInterceptor{

public Object createCglibProxy(Object target){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {

System.out.println("before");
Object object = arg3.invokeSuper(arg0, arg2);
System.out.println("after");
return object;
}

}
package client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cglib.MyCglib;
import bean.FinalPeople;
import bean.People;

public class Main {

public static void main(String[] args) {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"resource/*.xml");
People people = (People) applicationContext.getBean("people");
MyCglib myCglib = (MyCglib)applicationContext.getBean("cglib");
People peopleProxy = (People)myCglib.createCglibProxy(people);
peopleProxy.say();
System.out.println();
FinalPeople finalPeople = (FinalPeople) applicationContext
.getBean("finalPeople");
// FinalPeople finalPeopleProxy = (FinalPeople) myCglib
// .createCglibProxy(finalPeople);
// finalPeopleProxy.say();
}

}

3.3xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="people" ></bean>
<bean id="cglib" ></bean>
<bean id="finalPeople" ></bean>
</beans>

3.4运行结果

before
say
after

4.总结

如果需要对无法用jdk代理的bean进行代理
可以使用CGLIB代理
CGLIB : Code Generation Library
一个高性能开源代码生成包
采用非常底层的字节码技术,对目标类生成子类,并对子类进行增强。
代理调用的是子类。

缺陷:
如果目标类使用了final修饰,那么不可以使用CGLIB


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24276.html

    分享给朋友:

    “springAOP(CGLIB代理)” 的相关文章

    inet.ws 纽约VPS测评:高性能不限流量,享受流畅网络体验

    inet.ws 是一家在2020年成立的科技公司,专注于提供高性能的VPS服务。从成立之初,我们的目标就是为用户提供稳定、高效且不限流量的虚拟服务器解决方案。我们深知,无论是个人用户还是企业客户,都需要一个可靠的网络环境来支持他们的日常操作和业务需求。因此,我们致力于打造一个能够满足多样化需求的服务...

    Linode测速:优化云服务器性能与用户体验的全面指南

    Linode概述 Linode是一家以云计算服务而闻名的公司,提供虚拟私人服务器(VPS)以及一系列相关的云服务。对于那些追求灵活、高性能解决方案的用户,Linode无疑是一种不错的选择。你只需在Linode官网注册账户,便可以获得100美元的赠送额度,轻松体验其各项服务。这种简单快捷的注册过程让许...

    如何有效进行Payoneer绑定PayPal的详细步骤指南

    在目前的数字支付环境中,Payoneer和PayPal是两个广受欢迎的支付平台。首先,Payoneer(派安盈)是一个全球化的支付解决方案,专为跨境电商卖家、独立站卖家及B2B外贸商家设计。它支持多种货币的收付款服务,覆盖190个国家,包含了70种币种。这意味着无论在哪个地方进行交易,Payonee...

    香港VPS推荐:如何选择适合你的虚拟私人服务器

    在进入VPS的世界之前,理解什么是VPS非常重要。VPS,全称为虚拟私人服务器,它实际上是利用物理服务器上的资源,通过虚拟化技术,创建出多个独立的小型服务器。这种方式使得每个VPS都可以运行自己的操作系统,用户可以自由配置和管理,就像拥有一台独立的服务器一样。其实,我最初接触VPS时,正是被这种独立...

    日本节点的重要性与旅行体验优化指南

    日本节点的定义与重要性 在数字化飞速发展的今天,网络成为了沟通和信息流通的主要渠道。这里提到的“节点”,其实是指网络中数据传输的关键环节,可以理解为互联网的一个重要接点。每一个节点都承担着流量的传输与分发,确保数据能够迅速而高效地在全球范围内流动。想象一下,网络就像一张巨大的蜘蛛网,各个节点犹如网中...

    外网域名哪里最便宜?选择最佳注册商的指南

    1.1 什么是外网域名注册商? 外网域名注册商是提供域名注册服务的公司,它们通常允许用户选择和注册自己希望拥有的网站地址。这些注册商的作用不仅仅是处理注册申请。它们还提供一系列相关服务,例如域名转移、续费、DNS管理以及隐私保护等。选择合适的注册商对于建立网站而言非常重要,它直接影响到域名的成本和后...