spring之3

1.AOP相关术语介绍.avi(掌握)


目标对象target:   被代理增强的对象     
连接点join point: 被拦截到的方法
切入点pointcut:   被拦截到的方法当中可以插入增强的方法
通知advice:       增强的代码
切面aspect(关系): 通知和切点的结合,指定把什么(增强)插入到哪里(切点)去
织入weaving:      通知插入到切点的过程
代理 Proxy:       通知插入到切点通过代理完成的
引介 introduction:作用在类上,可以为一个类增加属性和方法
 
2.个人对于AOP的理解:


3.AOP在Spring中的实现原理:
1.我们首先从Spring 的 IOC 说起,Spring是一个管理 bean 的大工厂,只要放入到Spring管理的类,都可以从工厂BeanFactory(的子类
比如:ClassPathXmlApplicationContext)的getBean()方法获得对象,创建过程是框架利用反射技术实现的,在创建过程中分了好多步骤:
Bean的生命周期:
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware执行setBeanName
4.如果Bean实现BeanFactoryAware或ApplicationContextAware设置工厂setBeanFactory或上下文对象setApplicationContext
5.如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean执行afterPropertiesSet
7.调用自定义的init-method方法
8.如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现DisposableBean执行destroy
11.调用自定义的destroy-method
2.在上边的bean声明周期中的 第5步和第8步 有一个很重要的类:后处理bean: BeanPostProcessor 这个类中的方法
postProcessBeforeInitialization()在我们获得到bean对象之前可以做拦截,它返回给我们什么,我们就拿到了什么,AOP也就是在这个
时候实现的;AOP最终的结果是要给我们的bean对象增强: 下面就来聊聊为了实现AOP,我们都做了什么:
1.我们要创建一个目标(target)类,里边有各种业务方法,然后将这个目标类注册到Spring容器管理中;
2.我们创建一个通知类(xxxHelper 或者 xxxAdvice) ,里边是各种通知方法:
1. 前置通知Before 相当于BeforeAdvice
2. 后置通知AfterReturning 相当于AfterReturningAdvice
3. 环绕通知 Around 相当于MethodInterceptor
4. 抛出通知AfterThrowing 相当于ThrowAdvice
5. 引介通知DeclareParents 相当于IntroductionInterceptor
6. 最终通知After 不管是否异常,该通知都会执行
3.接下来我们要做的就是编写一个切面:切面由 切点 和 通知组成 
1.切点: 就是指定对那个方法,或者哪类方法增强,
2.通知: 就是指定如何对切点方法进行增强,
3.切面: 就是切点和通知的对应关系, 通过对切面的解析,我们就知道对哪个方法做什么样的增强;
4.这个时候在后处理bean 的postProcessBeforeInitialization()(或者 postProcessAfterInitialization())方法会首先拦截到
我们调用getBean()方法获得的bean,然后拿着这个bean,利用动态代理技术,
1.给我们创建一个代理对象proxy,并返回;
2.在invoke方法中做方法增强:
1.根据切点拦截要增强的方法,
2.根据切面找到对应的增强,判断是是何种增强,根据增强方式,做增强操作;这样在我们用代理proxy调用核心业务
方法时,调用的是invoke方法中增强以后的方法;




4.代理工厂类做的事情:
当你给动态代理工厂一个需要被代理的对象 target 时,动态代理工厂用Proxy的API给你动态创建一个代理对象proxy,并且会同时给
这个代理对象绑定了一个invoke()方法(ps:这个invoke()方法是在一个 Invocation 类中定义的),这个invoke方法有何特
点呢? 1.因为代理对象 proxy 是工厂给你的,这个invoke()方法也是工厂给你绑定的,所以,这个invoke()方法可以监听到你在
什么时候,调用了这个代理 proxy 的哪个方法 method(),所以一旦你调用代理的某个方法,马上就会被invoke()方法监听到,它可以马上
获得当前被调用的方法 method() 的对象 Method,以及调用方法的代理对象 proxy ,还有你调用方法时传入的参数 Object[] params ;
当然,此时你也可以获得被代理的对象 target(实际操作中是让代理工厂实现了Invocation接口,那么invoke()方法也在代理类中,所以在创
建代理类时通过构造传参,将对象target传过去),那么此时此刻,你可以在invoke(),方法中直接 用你获得的method对象,传入被代理的对象
target 和 参数 params,这样就完成了通过代理对象 proxy 调方法,实现了 目标对象 target 的相应方法被调用,但是,但是,如果你一旦
在invoke()方法中写点儿其他东西,比如说:你在 Method 对象invoke之前或者之后 做了一些其他的操作,那么这就意味着,此时此刻,你用
代理调用方法,不仅意味着目标对象target的相应方法被调用,而且同时执行了其他操作,这个就是动态代理实现了功能的增强;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值