栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SSM之SpringAOP开发/Spring中的AOP是什么?/AOP底层实现怎么弄的?/Spring中AOP底层代码怎么写

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SSM之SpringAOP开发/Spring中的AOP是什么?/AOP底层实现怎么弄的?/Spring中AOP底层代码怎么写

写在前面:
接着记录自己的Spring学习之旅,若看不懂则建议先看前几篇博文,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!

1.9 AOP 1.9.1 AOP介绍 1.9.1.1 概念

为Aspect Oriented Programming首字母缩写,即切面编程,是一种通过预编译方式和运行期动态代理实现程序功能的统一维护技术!是OOP(Object Oriented Programming)的延续,也是函数式编程的一种衍生范型。

1.9.1.2 目的

利用AOP可以隔离业务逻辑的各个部分,从而降低业务逻辑各部分之间的耦合度,提高程序的可重用性,同时也大大提高了开发的效率!

1.9.1.3 优势与作用 1.9.1.4 底层实现

Spring提供的动态代理实现!运行期间,Spring通过动态代理动态生成代理对象,其执行时进行功能增强介入,再去调用目标对象方法从而实现目标!

1.9.1.5 动态代理技术 1.9.1.5.1 JDK代理(基于接口)

目标对象必须要有接口才能使用,生成的代理对象是基于接口的,代理对象拥有目标对象的方法,如图!

1.9.1.5.2 cglib代理(基于父类)

目标对象相当于父对象,代理对象相当于子对象,注意不是继承,是动态生成对象!

1.9.2 动态代理代码底层实现 1.9.2.1 项目准备

根据[[#1 2 2 Spring项目搭建 IntelliJ IDEA 2020 1 Ultimate Edition]]搭建一个简单的项目并配置好所缺目录,如图

1.9.2.2 JDK动态代理
  • 在jdk目录下新建Tearget接口与其实现类并重写方法,如图
  • 同样目录下新建类,里面写入前后增强执行方法,如图
1.9.2.3 Cglib动态代理
  • 在pom文件中加入Spring-context资源依赖,此资源依赖中包含其cglib资源包,如图
  • 复制JDK包下执行加强类,并新建目标对象target类,如图
1.9.2.4 测试JDK代理

在test目录下新建测试类进行测试,代码如下:

public class test {  
    @Test  
 public void testJDKProxy()  
    {  
        final TargetInterfaceImpl target = new TargetInterfaceImpl();  
		// 获取增强对象  
 		final EnhanceRunning enhanceRunning = new EnhanceRunning();
		// 返回值为动态代理生成的代理对象  
 		TargetInterface targetInterface = (TargetInterface) Proxy.newProxyInstance(  
		// 目标对象类加载器  
 			target.getClass().getClassLoader(),  
			// 目标对象相同的接口字节码对象数组  
 			target.getClass().getInterfaces(),  
 			new InvocationHandler() {  
			// 执行代理对象方法默认都会执行invoke方法  
 			@Override  
 				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
				// 执行前增加  
				 enhanceRunning.before();  
				// 执行目标方法  
				 method.invoke(target, args);  
				// 执行后增强  
				 enhanceRunning.after();
 				return null; }  
                }  
        );  
		// 调用代理对象方法  
		 targetInterface.testMessage();  
 	}  
}

结果如图显示则成功!

1.9.2.5 测试Cglib代理

代码和测试JDK动态代理相似,但不要求掌握,了解即可如下:

    @Test  
 public void testCglib()  
    {  
		// 目标对象  
		 final Target target = new Target();  
		// 增强对象  
		 final EnhanceRunning enhanceRunning = new EnhanceRunning();  
		// 创建增强器  
		 Enhancer enhancer = new Enhancer();  
		// 设置父类(目标)  
		 enhancer.setSuperclass(Target.class);  
		// 设置回调  
		 enhancer.setCallback(new MethodInterceptor() {  
					@Override  
			 public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {  
			// 执行前增强  
			 enhanceRunning.before();  
			// 执行目标方法  
			 Object object = method.invoke(target,objects);  
			// 执行后增强  
			 enhanceRunning.after();  
			 return object;  
		 	}  
        }); 
				// 生成代理对象  
		 Target proxy = (Target) enhancer.create();  
		 proxy.testMessage();
 }

结果如图显示则成功!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号