(1)面向切面编程(Aspect Oriented Programming,AOP),利用AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
AOP 底层使用动态代理
参考博客:JDK和cglib实现
1)若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
2)若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
参考博客:字节码增强和Spring AOP原理
注意:
Spring中默认的策略是如果目标类是接口,则使用JDK 动态代理技术,否则使用Cglib 来生成代理。
连接点(JointPoint):目标对象中所有可以增强的方法叫做连接点。
切入点(PointCut):目标对象中将要被增强的的方法。
通知(Advice):实际需要添加的逻辑部分。
关注点:是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点:部分关注点横切程序代码中的数个模块,即在多个模块中都有出现,它们即被称作横切关注点。如日志 , 安全 , 缓存 , 事务等等 ,这些功能往往横跨系统中的每个业务模块。
切面(Aspect): 对横切性关注点的抽象,即为切面。一个切面就是一个类。类里面的方法就是一个通知。
目标(Target):被通知对象。
代理(Proxy):将通知应用于目标对象后创建的对象。
Weavy(织入): 将通知应用到连接点的过程。
横切关注点,即哪些方法需要被拦截,执行什么样的逻辑。对关注点的抽象,即是切面。一个切面就是一个类,类里面的方法就是一个通知。有了切面和通知,就需要定义这些通知的切入点,换句话说,就是哪些方法需要被拦截,而这些被拦截的方法就是连接点,所谓的连接点就是被织入切面的方法。通知的执行就是织入的过程,而被织入这些通知的对象,就是目标对象。
Spring的AOP框架里的5种Advice(通知),在不改变原代码的情况下去添加新功能。
(1)前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
(2)后置通知[After advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
(3)环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(连接点)(调用ProceedingJoinPoint的proceed方法)还是中断执行。
(4)正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
(5)异常返回通知[After throwing advice]:在连接点抛出异常后执行。