理解AOP是什么
AOP是Aspect-oriented programming 面向切面(方面)编程的简写
AOP的实现可以对业务逻辑和系统级的服务(系统日志,事务,权限验证)进行隔离,使业务逻辑跟各系统服务间的业务逻辑耦合度降低,提高代码的利用率与开发效率。
AOP的实现是通过动态代理实现的
有两种实现方式JDK 动态代理来和CGLIB动态代理
JDK 动态代理(优先):只能通过代理接口的实现类(基于接口编程)
CGLIB动态代理:可以代理接口的实现类,也可以代理没有实现接口的类。如果目标对象被final修饰.那么该类无法被cglib代理.
aop名词解释
AOP 的开发中的相关术语:
Joinpoint(连接点):目标对象中,所有可以增强的方法
Pointcut(切入点): 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
Advice(通知/增强):增强的代码
Target(目标对象):被代理对象
Weaving(织入):将通知应用到切入点的过程
Proxy(代理):将通知织入到目标对象之后,形成代理对象
aspect(切面):切入点+通知
aop思想: 横向重复,纵向抽取
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)