AOP学习笔记

AOP是一种编程范式,弥补了面向对象编程的不足,并不强制使用。

 

目的:结构清晰、简单

 

程序大了以后。。什么都会变得复杂、难懂


AOP不是给你功能,是作规划,使一个对象是尽可能的单一。

 

AOP:关注的是关注点,是面向对象的有益补充。横向考虑模块间共通的功能。


Aspect  OOP

看到别人看不到的,解决别人解决不了的

 

1 谁来关注?谁关注谁?
spring关注target里的点(连接点、切入点)
连接点对应的advice是什么?

2 关注到后怎么处理?


通知的类型:根据不同的触发时间点。

方法前执行:某连接点之前执行的通知。

方法后通知:某连接点正常完成后执行的通知。

环绕通知:包围一个连接点的通知,如方法调用。可以控制本方法,替换本方法。既有before又有after,

抛出异常后通知

spring放那看你一个人看3天看不懂,这一个月你不用看了,你的思维方式和技能储备上不可能有突飞猛进的变化。

 

AspectJ 配置步骤

1添加Library
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

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值