AOP如何实现及实现原理
1.AOP简介
2.AOP实现原理
3.静态代理和动态代理的区别
4.代码实现举例
1. AOP简介:
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP能够让我们在不影响原有功能的前提下,为软件横向扩展功能。
eg:当我们需要为多个对象引入一个公共行为,比如日志,操作记录等,就需要在每个对象中引用公共行为,这样程序就产生了大量的重复代码,可以通过使用AOP解决这个问题。
2.AOP实现原理
AOP的实现原理是动态代理,讲到动态代理之前先说一下代理模式, 代理模式是指给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
代理模式包含如下角色:
subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口;
RealSubject:真实主题角色,是实现抽象主题接口的类;
Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。
代理对象提供与真实对象相同的接口,以便代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
eg:一个班上的学生需要交作业,现在由班长代理交作业,那么班长就是代理,学生就是被代理的对象。
3.静态代理和动态代理的区别
按照代理的创建时期,代理类可以分为两种:
静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态代理:动态代理是指在java程序运行过程(程序已经启动正在运行中)由jvm生成代理类的class信息,该class信息生成后是直接处于内存中的,并没有写入磁盘保存起来,然后通过反射方式实例化代理类对象.
因为代理类的class信息已经存在于内存中,所以可以通过反射方式实例化。
他们的区别如下:静态代理的的代理类是我们自己定义好的,在程序运行之前就已经编译完成,但是动态代理的代理类是在程序运行时创建的。相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
4.代码实现举例
首先定义一个自定义注解作为切点
@Target(AnnotationTarget.FUNCTION) //注解作用的范围,这里声明为函数
@Order(Ordered.HIGHEST_PRECEDENCE) //声明注解的优先级为最高,假设有多个注解,先执行这个
annotation class Hanler(val handler: HandlerType) //自定义注解类,HandlerType是一个枚举类型,里面定义的是各种用户的操作
其次是定义切面类
@Aspect //该注解声明这个类为一个切面类
@Component
class HandlerAspect{
@Autowired
private lateinit var handlerService: HandlerService
@AfterReturning("@annotation(handler)") //当有函数注释了注解,将会在函数正常返回后在执行我们定义的方法
fun hanler(hanler: Hanler) {
handlerService.add(handler.operate.value) //真正执行记录的方法
}
}
最后是用户自己的业务方法
/**
* 删除学生方法
*/
@Handler(operate= Handler.STUDENT_DELETE) //当执行执行的操作时,切面类就会起作用了,当该操作结束后就会执行记录方法,我们就可以看到记录方法生成的数据
fun delete(id:String) {
studentService.delete(id)
}
之后代理就起到它本身的作用了……