前言: java后台开发中AOP、IOC、DI是个绕不去的坎,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...
一、什么是Spring aop
AOP(Aspect Oriented Programming),即面向切面编程,也就是把那些业务无关,但是又被业务模块所共同调用的逻辑或行为封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用场景:
1)日志,权限,监控,事务,异常
2)用于防止恶意攻击:时间内控制调用次数
3)防止sql注入,过滤敏感脚本
二、spring aop 实现原理
1、JDK动态代理
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是InvocationHandler接口和Proxy类
2、CGLIB动态代理
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的
3、在Spring中
1)、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2)、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3)、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
spring aop 注意事项:
1)如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2)如果目标对象实现了接口,也可以强制使用CGLIB实现AOP
3)如果目标对象没有实现接口,必须采用CGLIB的动态代理,spring会自动在两种模式之间转换
4)不管哪一种方式都不能用private和final做修饰词
注意:JDK动态代理要比cglib代理执行速度快,但性能不如cglib好
三、spring aop 增强类型
前置增强
因为spring只支持方法级的增强,所以MethodBeforeAdvice 是目前可用的前置增强,表示在目标方法执行前实施增强。
后置增强
表示目标方法在执行后实施增强
环绕增强
表示目标方法执行前后实施增强
异常知抛道出增强
表示目标方法抛出异常后实施增强
引介增强
表示在目标类中添加一些新的方法和属性
Spring AOP五种增强类型的使用,请点击跳转学习参考。。。
总结:
IOC容器:
具有依赖注入功能的容器,就是控制反转,创建对象,然后交给spring去控制。
AOP:
将那些共有代码,统一起来,就不用重复写入代码了,由容器组织直接使用,比如:日志记录,事务控制,异常处理,性能统计等。
DI依赖注入:
在容器创建对象后,直接在代码里注入即可使用对象。
结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)