重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这期内容当中小编将会给大家带来有关Spring AOP 与代理的概念与使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
创新互联建站服务项目包括沿河网站建设、沿河网站制作、沿河网页制作以及沿河网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,沿河网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到沿河省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!一、AOP 的基本概念
1.1 什么是 AOP
Aspect Oriented Programming,面向切面编程。
就跟我们说 OOP 是面向对象一样,AOP 是面向切面的。切面是分散在应用中的一个标准代码或功能。切面通常与实际的业务逻辑不同(例如,事务管理)。每个切面专注于一个特定的环切功能。
这里的切面呢,可以理解为横切。比如在所有的 DAO 层方法上加上一个同样的切面,功能是记录日志;又或者在某个接口上应用一个切面,作用是检查权限。
AOP 是基于代理来实现的。而代理又分为静态代理和动态代理。两者的区别在于代理类于何时生成。
下面我们讲讲代理是怎么回事?
1.2 代理与 Spring AOP
代理分为静态代理和动态代理:
Spring AOP 原理:
Spring AOP 中默认使用 JDK 动态代理,通过反射获取被代理的类,这个类必须实现一个接口。如果目标类没有实现接口,就会默认使用 CGLIB Proxy 来动态生成代理目标类,后者是被代理类的子类。
可以通过获取代理对象并打印的方式来查看其类型(JDK Proxy 下是 com.sun.prxy, CGlib 下是子类.
AspectJ: 用特定的编译器和语法,在编译时增强,实现了静态代理技术。
1.3 Spring AOP 与 AspectJ 的区别
AspectJ 是一套完整的 AOP 解决方案,而 Spring AOP 并不是 —— 它只是在 Spring 框架下满足其使用要求的一个解决方法,比如 Spring AOP 仅支持对方法使用切面。
二、静态代理
2.1 AspectJ 静态代理
基于特殊的编译器和语法。这里不多介绍了。
IDEA 下编译 AspectJ 可以参考这篇:https://blog.csdn.net/gavin_john/article/details/80156963
2.2 JDK 静态代理
实际上是利用实现一个具体的代理类来调用业务类。代理类持有了一个业务类的引用。
更概况地说,JDK 静态代理体现的是一种设计模式。
缺点很明显,代码冗余,难以维护。
这里以 借书 和 还书 这两个行为来作为一个示例:
编写一个 BookService 接口:
public interface BookService { boolean borrow(String id, String userName); boolean reBack(String id, String userName); }