【Spring6源码・AOP】代理对象的创建
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前三篇Spring IOC的源码解析与这一章的AOP是紧密相连的
首先介绍我们本章的demo
一个接口一个实现一个切面一个测试类。
public interface TestInterface {
void hello();
}
@Component
public class TestImpl implements TestInterface {
@Override
public void hello() {
System.out.println("hello,world!");
}
}
@Aspect
public class AspectJTest {
@Pointcut("execution(* *.hello(..))")
public void test(){}
@Before("test()")
public void before(){
System.out.println("before test..");
}
@After("test()")
public void after(){
System.out.println("after test..");
}
@Around("test()")
public Object around(ProceedingJoinPoint p){
System.out.println("Around before1");
Object o = null;
try {
o = p.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("Around after1");
return o;
}
}
@SpringBootTest
public class test {
@Autowired
private TestInterface test;
@Test
public void testData(){
test.hello();
}
}
前几章bean实例化之后我们对bean进行了属性填充紧接着就会调用initializeBean()方法返回该bean的代理对象如果不需要被代理那么就会直接返回该bean。最后无论返回的是代理对象还是原始对象都会将其存进一级缓存中。
首先我们看看是如何创建代理对象的。
步入initializeBean方法applyBeanPostProcessorsAfterInitialization方法就是用来生成代理对象
步入applyBeanPostProcessorsAfterInitialization方法在这个方法里面循环遍历所有 BeanPostProcessor调用它的 postProcessAfterInitialization 方法做后置处理。其中用于生成代理对象的就是 AnnotationAwareAspectJAutoProxyCreator。
步入postProcessAfterInitialization 方法中真正做事的是wrapIfNecessary方法包装成代理对象。
步入wrapIfNecessary方法会在里面根据我们的切面配置获取对应的通知器。
然后就是调用 createProxy 方法创建代理对象这里做了一个判断如果这个bean包含一些切面的配置那么就会调用createProxy对bean创建代理。
步入createProxy方法中最终会调用buildProxy方法来完成代理的创建。
会经过一下几步然后通过proxyFactory获取代理。
步入getPoxy方法首先会创建代理器。得到一个aop代理工厂用它去创建一个aop代理。
步入createAopProxy这里会决策aop到底是用JDK动态代理还是cglib代理。
如果这个bean是接口的话会使用Jdk动态代理。因为我们这里的bean是testImpl所以我们这里使用的是cglib代理。
创建完代理器就回去创建代理类步入如下方法createAopProxy()。
最终会调用buildProxy()方法构建代理类和代理对象。
最终创建的方法有点深大家请看。
步入===
步入===
以上创建完了代理对象最后再把代理对象存进一级缓存。
最终会真正的执行我们的目标方法但是步入该方法会进入cglib代理类的拦截方法。我们下一节好好聊聊这块。
cglib代理类
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |