博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP知识点整理
阅读量:4983 次
发布时间:2019-06-12

本文共 2231 字,大约阅读时间需要 7 分钟。

Spring的两个核心知识点是:IOC和AOP。

AOP是Spring 框架的一个关键组件,全称为Aspect-OrientedProgramming(面向切面编程),目前已是一种比较成熟的编程方式。

AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在编译或运行的时候,再将这些代码应用到需要执行的地方。

注:提取出来的代码应用到需要执行的地方,并不会把源代码加到需要的地方执行,即源代码文件不会更改,但是它会影响最终的机器编译代码

意思就是,有一些通用功能的代码可以提取出来,然后在使用的时候应用进去就可以了,比如表单验证和日志记录等等

 

AOP术语

Aspect(切面)

通常指封装起来用于插入到指定位置实现某项功能的类

 

Join point(连接点)

在SpringAOP中,连接点指方法的调用

 

Pointcut(切入点)

切面与程序流程的交叉点,即那些需要处理的连接点,通常在程序中,切入点指的是类或者方法名

 

Advice(通知/增强处理)

就是程序实际运行之前或之后执行的方法,也就是AOP加入的代码

 

Target Object(目标对象)

即需要加入AOP代码的对象

 

Proxy(代理)

AOP框架动态生成的一个对象,该对象可以作为目标对象使用

 

Weaving(织入)

把切面连接到其它的应用程序类型或者对象上,并创建一个需要Advice对象的过程

 

把目标对象放入代理对象之后,获取了一个增强后的目标对象  【注意:被代理对象实现的所有接口,意思是目标对象需要实现接口?】  

 

【1】问:Java中的动态代理有几种实现方式,各有什么优缺点?

解: Java中,实现动态代理有两种方式:

1、JDK动态代理:java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。

2、Cglib动态代理:Cglib (Code Generation Library )是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象,从而实现对目标对象功能的扩展。 关于这两种动态代理的写法本文就不深入展开了,读者感兴趣的话,后面我再写文章单独介绍。

本文主要来简单说一下这两种动态代理的区别和用途。

JDK动态代理和Cglib动态代理的区别

JDK的动态代理有一个限制,就是使用动态代理的对象【目标对象】必须实现一个或多个接口。如果想代理没有实现接口的类【目标对象】,就可以使用CGLIB实现。 Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dyn aop,为他们提供方法的interception(拦截)。

Cglib包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它需要你对JVM内部结构包括class文件的格式和指令集都很熟悉。

Cglib与JDK动态代理最大的区别就是: 使用动态代理的对象必须实现一个或多个接口 使用cglib代理的对象则无需实现接口,达到代理类无侵入。

 

jdk动态代理要求被代理对象必须实现至少一个接口

cglib动态代理没有上述的要求,是通过创建子类对象实现的,因此是无法代理final类和父类的final/static方法.

cglib代理的性能比jdk代理高,但是创建对象消耗时间却很多,比较适用于不需要频繁创建代理对象的场景

jdk动态代理只与接口有关(类加载器没试过),接口相同不会生成新的类。

 

【2】问:Java中动态代理有哪些用途。

解:Java的动态代理,在日常开发中可能并不经常使用,但是并不代表他不重要。

Java的动态代理的最主要的用途就是应用在各种框架中。因为使用动态代理可以很方便的运行期生成代理类,通过代理类可以做很多事情,

比如AOP,比如过滤器、拦截器等。

在我们平时使用的框架中,像servlet的filter、包括spring提供的aop以及struts2的拦截器都使用了动态代理功能。

我们日常看到的mybatis分页插件,以及日志拦截、事务拦截、权限拦截这些几乎全部由动态代理的身影。

 

 

 

【7】问:Spring的AOP是怎么实现的?

解: Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。

JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。

CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

 

 

AspectJ

AspectJ实现AOP有两种方式:一种是基于XML的声明式,另一种是基于注解的声明式

基于XML的声明式AspectJ要便捷一些,但是存在配置信息多的缺点;

基于注解的声明式AspectJ则通过注解的方式减少了很多配置信息。

 

转载于:https://www.cnblogs.com/smallwangmusk/p/11485209.html

你可能感兴趣的文章
git工作流程
查看>>
Excel坐标自动在AutoCad绘图_3
查看>>
hacknet
查看>>
HTML语义化初探
查看>>
Peaceful Commission 2-sat
查看>>
bzoj3810: [Coci2015]Stanovi(记忆化搜索)
查看>>
azkaban调度
查看>>
11、增强型for循环对二维数组的输出(test8.java)
查看>>
模拟百度搜索“2012世界末日”网页地震撕裂效果
查看>>
数据库锁表的分析与解决
查看>>
.NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件
查看>>
[故障公告]14:39-15:39博客站点部分负载均衡遭遇3次20G以上的流量攻击
查看>>
面向中文的自然语言编程
查看>>
Flutter工程目录
查看>>
hive 函数 current_date()
查看>>
使用python+selenium对12306车票数据读取
查看>>
服务器Config文件不能查看的问题
查看>>
UIImage与CCSprite互相转换
查看>>
jsp详解
查看>>
大型网站架构图
查看>>