1>Spring是如何解析@Configuration
先看2个现象
现象1>
Spring源码解析6>
Spring源码解析6>
Spring源码解析6>
我们@Bean吧这2个类给注入到Spring当中,并且调用一下
Spring源码解析6>
看效果 打印一次UserSerce
现象2>
Spring源码解析6>
现在是加了@Configuration的注解,如果去除这个注解 结果有不一样
我也说了 Spring进行了cglib进行代理
写一段伪代码吧
Sprign大致是这个思路
if(first){
new Object();
}else{

Application.get();
}
//------------->如果2次都new了就与Spirng单利违背了单利的原则
我们先看下Spring的cglib代理
Spring源码解析6>
Spring源码解析6>

1.cglib是基于父类的
2>添加一个setInterfaces
3.命名策略
4>回调函数
为什么要加入一个EnhancedConfiguration呢Spring源码解析6>
我们看到了什么 BeanFactoryAware 继承了他
Spring源码解析6>
也就是说我们cglib动态产生的类 比如说xxx
public class xxx entend Appconfig impentent EnhancedConfiguration{
BeanFactory beanFactory
void setBeanFactory(BeanFactory beanFactory) throws BeansException{};
}
我也就写一段伪代码 为啥要有 BeanFactory呢 因为我上面说了如果不是第一次的话 他就得BeanFactory。getBean();
=======================================================>
我们把他这段代码拿过来改改看看Cglib代理
UserService类

Spring源码解析6>

Spring源码解析6>
Spring源码解析6>
这里解释下methodProxy.invokeSuper(o,objects);//
这个代码是执行父类的方法 也就是说 UserService#query
============================>
好了我也说了我们的伪代码
if(first){
new Object();
}else{

application,getI();
}
自然将上面使我们一般人的想法
Spring怎么做
if(first){
methodProxy.invokeSuper(o,objects);//直接执行父类的方法
}else{
application,getI();

}
// 看Spring 做到的多牛逼

我不是空谈啊 Spring这里有代码 在他的<CALLBACK_FILTER>里面
Spring源码解析6>
我们先看完他的大致逻辑再说细节吧
也就是现在
if (isCurrentlyInvokedFactoryMethod(beanMethod)) {

//调用父类
}else{

// get对象
}
//------------->isCurrentlyInvokedFactoryMethod(beanMethod)
这个方法判断是不是第一次 点进来看看
这里先想下
appconfig----------------->xx代理
userservice1()-------||-userservice1()//xx当中的userService1方法
也就是Spring在执行代理的方法时会判断是不是正在执行的方法
Spring源码解析6>
举个例子啊 如果userService()方法第一次进入的话 他此时正在执行的方法还是他
如果userService第二次进入的话,他此时正在执行的方法就是userService1()
=========================>spring是这样判断的
Spring源码解析6>
然后跳出来将Bd的class属性更改一下
Spring源码解析6>
终于吧这个方法讲完了
=============================>

相关文章:

  • 2022-12-23
  • 2021-07-30
  • 2021-06-01
  • 2021-10-21
  • 2021-04-11
  • 2021-11-27
  • 2021-06-18
猜你喜欢
  • 2022-01-05
  • 2021-08-25
  • 2021-06-14
  • 2021-05-17
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案