【修真院Java小课堂】SpringAOP

大家好,我是IT修真院XX分院第一期的学员XX,一枚正直纯洁善良的XX程序员

今天给大家分享一下,修真院官网Java任务一,深度思考中的知识点——springAOP




1.背景介绍

spring框架中有两个核心思想是IoC和AOP。AOP中文意思是面向切面编程,和IoC一样,AOP也是为降低耦合度而生的。

AOP中把程序分成核心业务和周边业务,(与核心业务无关却被大多数业务模块所调用的称为周边业务)。

周边业务在AOP里,即被定义为切面。

核心业务功能和切面功能分别独立进行开发 ,然后把它们 "编织" 在一起,这就叫AOP。

AOP的作用就是:减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

分布于应用中多处的功能称为横切关注点,通常这些横切关注点在概念上是与应用的业务逻辑相分离的,但其代码往往直接嵌入在应用的业务逻辑之中。将这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的。

AOP具体可以在下面的场景中使用:

权限、缓存、内容传递、错误处理、懒加载、调试、日志管理、性能优化、持久化、资源池、同步、事务

2.知识剖析

(1)spring的AOP支持

(2)AOP术语

(3)基于xml和注解的配置方式

(1)spring中的AOP的两种代理方式:JDK动态代理、cglib代理,spring默认为jdk动态代理。

1)jdk动态代理:利用反射机制生成一个实现代理接口的匿名类。

2)CGLIB代理:cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

原理区别:

JDK动态代理只能对实现了接口的类生成代理,而不能针对类;在创建代理实现类时比CGLib要快,创建代理速度快。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法;创建代理速度比JDK慢,但运行速度比JDK动态代理快。

(2)AOP术语

1.连接点(Joinpoint):能够应用通知的点 ,是在应用执行过程中能够插入切面的一个点。在spring中,这些点指的是方法,spring只支持方法级别的连接点,一个类里有多少方法就有多少Jointpoint。

2.通知(Advice):也称为增强。指的是拦截到Joinpoint后你想要扩展的功能,也就是上面说的 安全,事物,日志等。

有五种类型的通知:

Before(前置):在方法被调用之前调用通知;

After(后置):在方法调用之后调用通知;(不管该方法是否执行成功)

After-returning(返回结果通知):在方法返回结果后;

After-throwing(异常通知):在方法抛出异常后;

Around(环绕):在方法调用之前和之后都会调用通知;

3.切入点(Pointcut):指的是我们要对哪个连接点进行拦截的定义。

4.切面(Aspect):切面是通知和切入点的结合。

通知说明了扩展的功能是什么和什么时候扩展,而切入点说明了在哪里进扩展(指定到底是哪个方法),这就是一个完整的切面定义。可以看出切面就是表述的一个过程,就是将增强应用到具体方法上的过程。

5.引入(introduction):引入允许我们向现有的类添加新方法或属性,从而可以在无需修改现有类的情况下,让它们具有新的行为和状态。

6.织入(weaving):是把增强应用到目标的过程。

7.目标(target):代理的目标对象(要增强的类)

8.代理(proxy):通过代理实现整套aop机制的。

(3)基于xml和注解的配置方式

3.常见问题

使用springAOP实现日志管理

4.解决方案

5.编码实战

6.扩展思考

after和after-returning的区别?

7.参考文献

链接:https://baike.baidu.com/item/MyBatis/2824918?fr=aladdin

作者:百度百科

链接:https://www.w3cschool.cn/

作者:w3cschool

链接:https://blog.csdn.net/wangyongxia921/article/details/46272813

作者:_Cassie

http://how2j.cn/k/spring/spring-aop/89.html#step5306

作者:how2j

链接:https://www.cnblogs.com/fenglie/articles/4097759.html

作者:fenglie

8.更多讨论

问题一:什么情况下会用哪种方式实现动态代理?

1. 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2. 如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3. 如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

问题二:编译时增强和运行时增强的区别?

编译时增强属于静态代理,运行时增强属于动态代理。

问题三:AOP织入方式有几种?

有三种:编译期织入,装载期织入,运行期织入。

问题四:目标是代理接口的时候,可以强制用cglib吗?

对于接口,spring默认使用jdk动态代理,但是可以强制使用cglib。


今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~



技能树.IT修真院   

  “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

   这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。


快来与我一起学习吧~http://www.jnshu.com/login/1/18140043

阅读更多
个人分类: spring
下一篇拦截器,过滤器,监听器各有什么作用?
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭