SpringAop及底层源码分析

理解AOP是什么

AOP是Aspect-oriented programming 面向切面(方面)编程的简写
AOP的实现可以对业务逻辑和系统级的服务(系统日志,事务,权限验证)进行隔离,使业务逻辑跟各系统服务间的业务逻辑耦合度降低提高代码的利用率与开发效率。

AOP的实现是通过动态代理实现的

有两种实现方式JDK 动态代理来和CGLIB动态代理
JDK 动态代理(优先):只能通过代理接口的实现类(基于接口编程)
CGLIB动态代理:可以代理接口的实现类,也可以代理没有实现接口的类。如果目标对象被final修饰.那么该类无法被cglib代理.

aop名词解释
SpringAop及底层源码分析_第1张图片
AOP 的开发中的相关术语:
Joinpoint(连接点):目标对象中,所有可以增强的方法
Pointcut(切入点): 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
Advice(通知/增强):增强的代码
Target(目标对象):被代理对象
Weaving(织入):将通知应用到切入点的过程
Proxy(代理):将通知织入到目标对象之后,形成代理对象
aspect(切面):切入点+通知

aop思想: 横向重复,纵向抽取

SpringAop及底层源码分析_第2张图片

spring Aop 动态的AspectJ Aop 静态的

调用父类无参的构造方法,实例化生成DefaultListableBeanFactory()对象

对于代理对象的追踪

//实例化各种bean
AnnotationConfigApplicationContext annotationConfigApplicationContext
            = new AnnotationConfigApplicationContext(Appconfig.class);
//得到bean
//实质,map.get("key")
annotationConfigApplicationContext.getBean(OrderService.class).query();

思路:因为实例化的bean太多,假设它在getBean(OrderService.class)中才被代理的,打断点查

/**找出什么时候被代理?
        只有找到了代理的地方
            才能知道Spring是如何代理
                才能知道SpringAOP的原理
 */   
 /**         
从getbean()出发,一直往下-----到NameBeanHolder()-----到都Get Bean()-----
到getSingleton()-------到docreatBean()----中有一个wrapper 
*/

在getSingleton()中加入一个条件断点 , 同时在getBean(OrderService.class)这行打上断点,运行时直接跳转到了getSingleton()中,说明在这个方法调用之前,还有东西调用了geiBean()。
Spring自身和我们都调用了reflus(),但是只产生一个工厂

singletonObjects(); //在里面完成的代理

在代理之前就已经被放在Spring容器中了

//target(原生对象)--------------proxy(代理对象)
docreatBean(){//创建了bean
    target(原生对象)转换-proxy(代理对象);
    return proxy(代理对象);
}

wrapper 一个原生存储原生对象的bean

//执行后置处理器,aop就是在这里完成的处理
initializeBean()

重点:AbstractAutoProxyCreater
底层是通过AbstractAutoProxyCreater的后置处理器来创建代理对象的

AbstractAutoProxyCreater extends ProxyProcessor()

initializeBean()

getBeanPostProcessors() //获得所有的后置处理器

BeanPostProcessor粗略理解

/**在new(初始化)一个bean中,进行1,2,3,4,后置处理器,调用BeanPostProcessor
来改变其过程中的bean对象*/
1
2
3
4
BeanPostProcessor
6
...
put map(bean)

你可能感兴趣的:(#,Spring)