Spring之AOP相关术语介绍

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的相应方法被调用,而且同时执行了其他操作,这个就是动态代理实现了功能的增强;
    
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章