什么是aop?
(篇幅)
aop 简介
AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。
说了一堆概念,什么是AOP? aop就是切面编程,一种范式,可以理解为对类中某种函数方法功能的增强,或者添加函数功能,拦截功能等。
先说一下平常的继承方式,纵向继承
例如定义一个用户类
public clss User
{
public void safe() //设置一个保存函数
{
System.out.println("save方法执行"); //里面只是简单的操作方便理解
}
public void delete() //这里设置一个删除函数
{
System.out.println("delete方法执行");
}
}
什么叫纵向继承 ,就是子类继承父类例如下面,继承了父类后,你可以重写函数,或者是再定义新函数来加强该类的总用,比如你还可以给类加一个查询的功能,这里你也可以理解加强二字,对吧,你函数更牛逼了,可以实现更多功能了
public class UserSon extends User
{
public void save() //重写父类方法
{
System.out.println("这是子类save方法");
}
public void find() //新增一个查找方法
{
System.out.println("这是新定义的find方法");
}
}
当然上面省略了delete方法,意思就是咱们传统的继承为纵向继承,就是在类中需要增加一种功能时候,然后继承父类,增加功能,创建一个新的方法函数。
aop代理模式
aop 是怎么进行它的操作呢?采用横向抽取机制,也称为代理模式,下面例子方便大家理解,都知道,项目中,一般都会一个类实现多个接口,接口方便管理
下面设置一个接口,是用户类
public interface UserDao()
{
public void save(); //设置保存函数
public void delete(); //设置删除函数
}
接口都知道吧,这里就步多讲了。
然后负责人将接口发放下面人员,来实现接口。
public calss UserDaoImpl implements UserDao()
{
public void save()
{
System.out.println("实现保存方法"); //这里将输出语句代替保存操作,方便理解
}
public void delete()
{
System.out.println("实现删除方法"); //同理
}
}
实现操作大家都知道,实现了某个接口,必须将其方法都实现,突然,负责人要求再加上用户校验是否正确,你才能使用save 和delete方法,很简单对吧,只要在实现类里面的每个函数调用前设置判断即可。下面为修改后
public calss UserDaoImpl implements UserDao
{
public void save()
{
System.out.println("用户校验"); //这里用简单的语句来代替校验操作
System.out.println("实现保存方法"); //这里将输出语句代替保存操作,方便理解
}
public void delete()
{
System.out.println("用户校验"); //这里用简单的语句来代替校验操作
System.out.println("实现删除方法"); //同理
}
}
像上面一样很简单,直接复制粘贴即可,但是当你实现多个接口,接口里又有很多方法呢,如果你都是复制粘贴,麻烦,造成代码冗余,很 傻X,不能够装逼
假设下面情况
public calss UserDaoImpl implements UserDao1,UserDao2,UserDAo3
{
public void save()
{
System.out.println("用户校验"); //这里用简单的语句来代替校验操作
System.out.println("实现保存方法"); //这里将输出语句代替保存操作,方便理解
}
public void delete()
{
System.out.println("用户校验"); //这里用简单的语句来代替校验操作
System.out.println("实现删除方法"); //同理
}
public void find()
{
System.out.println("用户校验");
System.out.println("实现查找方法");
}
public void open()
{
System.out.println("用户校验");
System.out.println("实现打开方法");
}
}
当你遇到上面这种多个方法实现的时候,真会复制粘贴吗?是不是显的很2b。这里aop概念就出来了,aop切向编程,并不像纵向编程,重写才能实现增添功能显得很麻烦,下面就是aop图示
当然,aop的实现 并不是像上面图一样,只是一个抽象图,就是将你要进行增强的函数,自动放到你产生的代理类中,然后产生的类就是你进行增加功能后的类,也是你原来类的代替品,就相当于上面传统方式的增强。UserDaoImpl类就和UserDaoImplProxy类属于平行的关系。所以称为aop代理模式。
总结
aop概念已经了解,就是横向掏出来函数方法,然后增强代码实现,增加函数功能,然后产生一个代理类。
aop相关术语
还是以那个为例子,要对实现类的功能实现增强,我们是要对save方法进行增强,就是要进行save操作的时候进行校验。
JoinPoint (连接点):就是类中的函数方法都被称为连接点。可以被增强的点,例如下面保存和删除的函数被称为连接点。
Pointcut(切入点):被拦截的点,就是类中你要加强的连接点(函数)我们要加强save方法函数,所以save方法就是切入点
Advice(通知):拦截后要做的事情,就是你要实现加强的操作就是通知,例如要对save方法实现用户校验的操作,那么该操作就叫通知
Target(目标):被增强的类(增强函数属于的类),称为目标。
Weaving(织入):将Advice应用到Target的过程。例如该例,将用户校验应用到该类中的过程
Proxy(代理):该词重中之重。实现增强后的类定义的对象就被称为代理。
Aspect(切面):就是切入点和通知的组合。可以把每个函数看为一个层面,然后把save方法抽取出来做修改。
这里篇幅过长,AOP具体的实现方法可见下篇文章。