Spring学习笔记(14)----使用CGLIB实现AOP功能

好久没学习spring了,今天接着学习。

接着这上面的例子,在上面的例子中我们的UserManagerImpl类是实现了UserManager接口,如果UserManagerImpl没有实现任何接口要怎么办呢?应为创建代理对象时我们需要指定接口的。

Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
									  targetObject.getClass().getInterfaces(),
									  this);

 

由于没有时间接口,因此我们是不能这样创建代理接口的,这是我们需要借助第三方包来实现。在spring中提供了cglib-nodep-2.1_3.jar包。我们通过cglib创建代理对象。

下面就通过实例演示通过cglib创建代理对象。

 

首先创建CGlibProxyFactory,实现MethodInterceptor接口,接口中有一个intercept方法,当代理对象的方法被调用时会调用这个方法。

package com.szy.spring;

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 CGlibProxyFactory implements MethodInterceptor
{
	private Object targetObject;
	
	public Object newProxy(Object targetObject)
	{
		this.targetObject=targetObject;
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());
		enhancer.setCallback(this);
		//返回代理对象
		return enhancer.create();
	}

	/**
	 * proxy        带来对象本身
	 * method       被拦截到的方法
	 * args          方法的参数
	 * methodProxy  方法的代理对象
	 */
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable
	{
		checkSecurity();
		Object ret=null;
		try
		{
			//调用目标对象的真实方法
			ret=method.invoke(this.targetObject, args);
			//ret接受存在的返回值,不存在返回值则为Null
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return ret;
	}
	public void checkSecurity()
	{
		System.out.println("--------UserManagerImpl.checkSecurity()----------");
	}
}

 

其实整个代码很前面的很相似,只是创建代理对象的方法不一样。

测试代码:

CGlibProxyFactory factory=new CGlibProxyFactory();
		//创建代理对象,这是这个代理对象是UserManagerImpl的子类
		UserManagerImpl userManager=(UserManagerImpl)factory.newProxy(new UserManagerImpl());
		userManager.addUser("coolszy", "kuka");

 

上面演示的几个事例是不借助与任何框架的情况下实现AOP的方法。 

细说Spring——AOP详解(使用CGLIB实现AOP) 一、动态代理实现AOP的缺陷 在上一篇文章细说Spring——AOP详解(动态代理实现AOP)中讲解了如何使用动态代理实现AOP,虽然Java动态代理为我们提供了非常灵活的代理机制,但Java动态代理是基于接口的,如果目标对象没有实现接口我们该如何代理呢?这时候我们就需要使用CGLIB来实现AOP了。 二、CGLIB实现代理的原理 我们先创建一个目标对象 package demo1; ... 阅读详情

相关推荐

Spring(aop介绍,底层实现,jdk代理,cglib代理)

之间执行的,他可以完成程序功能之间的松耦合,动态代理的作用也等同于Aop的作用:他提供了相应的封装,Aop是面向对象编程。

weixin_54048131的博客 739

快速cglib替代AOP解决内部调用

上级文章: 快速Mybatis动态数据源(基于java类):https://blog.csdn.net/qq_28033719/article/details/103609120 XXL-JOB设置前规则后规则:https://blog.csdn.net/qq_28033719/article/details/103701084 问题: spring - 4.1.2 版本,首先 spring 的 AOP 是可以开启 cglib 的代理,这意味着,AOP 原理是 cglib 的处理(具体了解 cgli

qq_28033719的博客 1396

spring框架学习(八)—静态代理、JDK与CGLIB动态代理、AOP+IoC

目录 一、为什么需要代理模式二、静态代理三、动态代理,使用JDK内置的Proxy实现四、动态代理,使用cglib实现五、使用Spring实现AOP六、使用IOC配置的方式实现AOP七、使用XML配置Spring AOP切面八、示例下载 一、为什么需要代理模式 假设需实现一个计算的类Math、完成加、减、乘、除功能,如下所示: 1 package com.z

流年~~ 1277

编译spring-framework-5.3.10出现org.springframework.cglib.core.internal不存在问题

spring-framework-5.3.10编译问题:org.springframework.cglib.core.internal不存在处理。

jiguang127的博客 2865

【Matlab/simulink/carsim】再生制动

【Matlab/simulink/carsim】再生制动

weixin_62311849的博客 621

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

Spring AOP中强制使用CGLIB代理

<aop:aspectj-autoproxy proxy-target-class=“true”/>

幻想的天空 670

PyTorch ModelNet点云数据集加载实战:从下载到Dataset类完整实现

在三维视觉与点云处理领域,数据集是算法研发的基石。ModelNet作为三维物体分类的基准数据集,其地位类似于图像领域的MNIST,是入门和评估模型性能的通用标准。理解其数据格式与加载原理,是进行点云分类、分割等任务的关键前置步骤。通过PyTorch的Dataset类,开发者可以构建高效的数据管道,将原始点云文件转换为神经网络可直接处理的张量格式,这一过程涉及数据采样、归一化、特征组装等核心操作,直接影响模型的训练效率和最终性能。本文聚焦于ModelNet10/40数据集,详细解析其目录结构,并提供一套稳健的

weixin_29032337的博客 283

Spring原理篇(14)--Spring AOP源码的实现<一>

@TOC# Spring系列 记录在程序走的每一步___auth:huf

wenaicoo的博客 2068

以太网详解(一)-MAC/PHY/MII/RMII/GMII/RGMII基本介绍

网络设备中肯定离开不MAC和PHY,本篇文章将详细介绍下以太网中一些常见术语与接口。 MAC和PHY结构 从硬件角度来看以太网是由CPU,MAC,PHY三部分组成的,如下图示意: 上图中DMA集成在CPU,CPU,MAC,PHY并不是集成在同一个芯片内,由于PHY包含大量模拟器件,而MAC是典型的数字电路,考虑到芯片面积及模拟/数字混合架构的原因,**将MAC集成进CPU而将PHY留在片外,这种...

sternlycore的博客 13万+

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.csdn.net/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3934

十一 使用CGLIB实现AOP功能与AOP概念解释

十一 使用CGLIB实现AOP功能与AOP概念解释 前面的proxy技术必须在类实现了接口的前提下才可以实现权限的控制,cglb可以在类不实现接口的情况下完成。 在spring文件夹下lib/cglib下找到cglib的jar库文件,加入工程。 CGlibProxyFactory.java view plaincopy to clipboardprint? 01.pack...

aiqing0119的专栏 212

OpenHarmony深度定制:从系统到模块的全景剖析与自定义模块实战

目标:在中新增一个算法库,让产品可直接调用。关闭不用的 20+ 系统部件,ROM 缩小 50 %;为自家芯片新增专用驱动模块,快速点亮开发板;内将核心算法库以部件形式集成,实现商业闭源。万物互联时代,差异化才是护城河。

m0_67505153的博客 1036

Spring 利用`AspectJ`模板实现AOP的功能-jdk代理技术-Cglib代理技术

AOP 一、什么是AOP 称为 面向切面编程,这也是一种编程思想,它是建立在面向对象编程(OOP)的思想之上。 面向对象编程采用的思路是自顶向下的思路,所有的类和接口都处于某种继承或实现的关系之上。 二、AOP的实现原理 1、理解代理设计模式(23中设计之一,结构型) (1)生活中的代理 为了喝牛奶,难道要养牛吗? 买车票找12306,等等,例子非常多,都是为了方便,快捷的干事情。 (2)项目中的例子,在实现功能时,经常会使用其它的类和接口,可是这些类可能不在身边,它在其它服务器上面,也就是要使用的类与当前

norang的博客 481

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2566

Spring AOP错误:无法代理目标类,因为CGLIB2不可用

在Spring AOP中,必须将cglib库包含到构建路径中,以避免出现“ 由于CGLIB2不可用而无法代理目标类 ”的错误消息。 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerServiceP...

一名可爱的技术搬运工 1026

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.

https://www.cnblogs.com/sweetchildomine/p/6978037.html 对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,SpringAOP,就切入不了 当然可以使用原生ASPECTJ,不用SpringAOP,但是基于生态链问题,还是尽量使用SpringAOP 这里简单说一下,Spring如何选择使用CGLIB,或者是

yygr的博客 1188

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring AOP 详解(jdk和cglib动态代理)

cgLib 动态代理: 目标对象: package proxy.cglib; public class Student { public String say(String message){ System.out.println("学生:"+message); return message; } } 代理模板: package proxy...

qq_29978863的博客 321

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于Spring中AOP的使用以及对数据库的连接操作

AOP AOP概念 什么是AOP 面向切面编程 利用AOP可以对业务逻辑的各个方面进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 通俗描述:不通过改源代码的方式,在主干功能里面添加新的功能 AOP的底层原理 AOP的底层使用动态代理 两种动态代理 有接口,使用JDK动态代理 创建接口实现类代理对象,增强类的方法 没有接口,使用CGLIB动态代理

qq_59776041的博客 2309

第三章 Spring AOP

1、下列有关AOP专业术语中,用于表示切面与程序流程的交叉点的是()。 A、Joinpoint B、Pointcut C、Aspect D、Advice 参考答案 :BD 2、以下有关CGLIB代理相关说法正确的是(‘D’)。 A、CGLIB代理的使用非常简单,但它还有一定的局限性——使用动态代理的对象必须实现一个或多个接口 B、如果要对没有实现接口的类进行代理,那么可以使用JDK代理 C、CGLIB是一个高性能开源的代码生成包,在使用时需要另外导入CGLIB所需要的包 D、Spring中的AOP代理,可以

weixin_46066900的博客 4634

Spring AOP源码学习:创建 AOP 代理

目录 前言 AnnotationAwareAspectJAutoProxyCreator AbstractAutoProxyCreator#postProcessAfterInitialization 代码块1:wrapIfNecessary 代码块2:getAdvicesAndAdvisorsForBean 代码块3:findEligibleAdvisors 代码块4:findAdvisorBeans 代码块5:findCandidateAdvisors 代码块6:buildAspect

程序员囧辉 5203

Spring的IOC和AOP

Spring、IOC、AOP、依赖注入、切面、事务

蓝影铁哥的博客 958
上一篇: 单态模式和静态类的区别
下一篇: Spring学习笔记(15)----使用Spring的注解方式实现AOP
coolszy
博客等级 码龄19年 2659粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值