AOP是一种编程范式,弥补了面向对象编程的不足,并不强制使用。
目的:结构清晰、简单
程序大了以后。。什么都会变得复杂、难懂
AOP不是给你功能,是作规划,使一个对象是尽可能的单一。
AOP:关注的是关注点,是面向对象的有益补充。横向考虑模块间共通的功能。
Aspect OOP
看到别人看不到的,解决别人解决不了的
1 谁来关注?谁关注谁?
spring关注target里的点(连接点、切入点)
连接点对应的advice是什么?
2 关注到后怎么处理?
通知的类型:根据不同的触发时间点。
方法前执行:某连接点之前执行的通知。
方法后通知:某连接点正常完成后执行的通知。
环绕通知:包围一个连接点的通知,如方法调用。可以控制本方法,替换本方法。既有before又有after,
抛出异常后通知
spring放那看你一个人看3天看不懂,这一个月你不用看了,你的思维方式和技能储备上不可能有突飞猛进的变化。
AspectJ 配置步骤
2采用Aspect定义切面
3在Aspect定义PointCut和Advice
4启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中
注意:在这种方法定义中,切入点的方法是不被执行的,它的存在目的仅仅是为了重用切入点即Advice中通过方法名引用这个切入点
AOP:
*Cross cutting concern
*Aspect
*Advice
*PointCut
*JoinPoint
*Weave
*Weave
*Target Object
*Proxy
*Introduction
依赖库
Advice
配置文件方式
没有改变原来的类,却可以追加原有类的功能,不通知你的情况下,改变你的功能,甚至屏蔽你的功能
瞧它不顺眼,直接干掉。自动回贴,加功能,减功能,屏蔽功能。
spring可装配:各块都是独立的块。
当业务变化,你程序改还是不改?
哪些放到Advice里,哪些不放到Advice里?
通用,要单一。找切面比较难。有好处,设计上有一定的难度
<aop:aspectj-autopoxy/>
Aspect默认情况下不实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口,如果没有实现接口必须引入CGLIB库
我们可以通过Advice中添加一个JoinPoint参数,这个值会由Spring自动传入,从JoinPoint中可以取得参数值、方法名等
1 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2 如果目标对象实现了接口,可强制CGLIB实现AOP
3 如果目标对象没有实现接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB间转换
如何强制使用CGLIB实现AOP?
*添加CGLIB库,spring_home/cglib/*.lib
*在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
JDK动态代理和CGLIB字节码生成的区别?
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其方法
因为是继承,所以该类最好不要申明成final