Spring AOP面向切面编程

Spring AOP面向切面编程
aspect oriented programming
AOP是以OOP为基础,区别在于侧重点不同。
OOP侧重点在于对象封装,
AOP侧重点在于某个共同逻辑的提取。
AOP可以将共同逻辑和传统业务逻辑隔离,降低业务之间的耦合度。
AOP优势,可以将共同业务逻辑和传统业务逻辑隔离,之后单独封装成独立组件,最后通过AOP配置建立作用关系。

AOP相关概念
1,切面aspect--要追加的共通处理
在某个时刻和阶段共通调用的业务逻辑。(共通性,调用时机相同)
2,切入点pointcut--给谁追加共通处理
用于指定目标组件及方法,spring提供了击中切入点表达式。
名称限定表达式
excution(修饰符? 返回类型(有没有返回类型都可以写*) 方法名(参数列表) 异常类型)
// 匹配所有以User结尾的方法
excution(* *User(...))
// 匹配UserService类中addUser方法
excution(* com.zhangchong.UserService.addUser(...))

excution(* com.zhangchong.UserService.*(...))
// 匹配com.zhangchong包下所有类所有方法
excution(* com.zhangchong.*.*(...))
// 匹配com.zhangchong包及子包下所有类所有方法
excution(* com.zhangchong..*.*(...))
类型限定表达式
within(类型)
// 匹配UserService类中所有方法
within(com.zhangchong.UserService)
// 匹配com.zhangchong包下所有类所有方法
within(com.zhangchong.*)
// 匹配com.zhangchong包及子包下所有类所有方法
within(com.zhangchong..*)

3,通知advice--啥时候调共通
用于指定切入的时机。意思就是切面和目标作用的时机。

UserService
切面:异常处理逻辑
切入点:利用表达式指定UserService方法去
通知:在service方法抛出异常后调用切面

进入每一个controller要先打一个桩

切面:打桩
切入点:利用表达式指定controller.execute方法
通知:在调用execute方法之前

spring提供以下5种通知
前置通知@Before
后置通知@AfterReturning
异常通知@AfterThrowing
最终通知@After
环绕通知=前置通知+后置通知@Around
try{
前置通知
...
后置通知
}catch(){
异常通知
}finally{
最终通知
}

Spring AOP实现原理
Spring AOP是采用动态代理设计模式实现的。
在使用AOP之后,Spring容器会根据目标组件,动态生成一个新的组件类型,该类称为动态代理类。
这个动态代理类重写了原有目标组件的业务方法,在重写方法中调用切面功能和原目标组件功能。
eg》UserService目标组件,切入事务》getBean("userService");》返回类型会发生改变,不是原来的UserService了。
UserServiceImpl(登录检查)
AOP》动态代理类$Proxy27》调用UserServiceImpl+事务切面组件功能》对外提供服务

Spring使用的动态代理技术有两种:
采用JDK API java.reflect.Proxy生成》默认适用于有接口目标组件
采用CGLIB技术生成》默认适用于没有接口目标组件

猜你喜欢

转载自blog.csdn.net/zh_chong/article/details/81285412