1>Spring是如何解析@Configuration
先看2个现象
现象1>
我们@Bean吧这2个类给注入到Spring当中,并且调用一下
看效果 打印一次UserSerce
现象2>
现在是加了@Configuration的注解,如果去除这个注解 结果有不一样
我也说了 Spring进行了cglib进行代理
写一段伪代码吧
Sprign大致是这个思路
if(first){
new Object();
}else{
Application.get();
}
//------------->如果2次都new了就与Spirng单利违背了单利的原则
我们先看下Spring的cglib代理
1.cglib是基于父类的
2>添加一个setInterfaces
3.命名策略
4>回调函数
为什么要加入一个EnhancedConfiguration呢
我们看到了什么 BeanFactoryAware 继承了他
也就是说我们cglib动态产生的类 比如说xxx
public class xxx entend Appconfig impentent EnhancedConfiguration{
BeanFactory beanFactory
void setBeanFactory(BeanFactory beanFactory) throws BeansException{};
}
我也就写一段伪代码 为啥要有 BeanFactory呢 因为我上面说了如果不是第一次的话 他就得BeanFactory。getBean();
=======================================================>
我们把他这段代码拿过来改改看看Cglib代理
UserService类
这里解释下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>里面
我们先看完他的大致逻辑再说细节吧
也就是现在
if (isCurrentlyInvokedFactoryMethod(beanMethod)) {
//调用父类
}else{
// get对象
}
//------------->isCurrentlyInvokedFactoryMethod(beanMethod)
这个方法判断是不是第一次 点进来看看
这里先想下
appconfig----------------->xx代理
userservice1()-------||-userservice1()//xx当中的userService1方法
也就是Spring在执行代理的方法时会判断是不是正在执行的方法
举个例子啊 如果userService()方法第一次进入的话 他此时正在执行的方法还是他
如果userService第二次进入的话,他此时正在执行的方法就是userService1()
=========================>spring是这样判断的
然后跳出来将Bd的class属性更改一下
终于吧这个方法讲完了
=============================>