spring bean的创建过程二

我们知道bean的创建过程主要是getBean->doGetBean->createBean->doCreateBean

开始进入源码,断点查看

 

先从缓存中获取单例对象getSingleton

并没有,直接返回

为指定的Bean标记为已经创建(或将要创建)

下面将进入创建bean

此处需要注意:ObjectFactory接口

先来看下ObjectFactory源码

这个接口的定义非常简单,就是一个对象工厂,定义了一个返回对象的工厂方法。

ObjectFactory是一个普通的对象工厂接口。在AbstractBeanFacotry的doGetBean部分的源码中,可以看到spring对ObjectFactory的应用之一就是,

将创建对象的步骤封装到ObjectFactory中 交给自定义的Scope来选择是否需要创建对象来灵活的实现Scope。

通俗简单的说:

ObjectFactory就一个函数式接口,当调用其中的getObject方法的时候,才会将实际传递的匿名内部类中的实现逻辑来进行执行

进入createBean方法了

进入方法:锁定class,根据设置的class属性或者根据className来解析class

根据类全限定字符串获取Class

接下来继续看:

这里有个知识点说一下:

* spring中默认的对象都是单例的,spring会在一级缓存中持有该对象,方便下次直接获取,

* 那么如果是原型作用域的话,会创建一个新的对象

* 如果想在一个单例模式的bean下引用一个原型模式的bean,怎么办?

* 在此时就需要引用lookup-method标签来解决此问题

* 通过拦截器的方式每次需要的时候都去创建最新的对象,而不会把原型对象缓存起来

进入doCreateBean方法了

进入实例化

进入到使用的地方了

进入到动态代理

到这里就创建好了对象

进入到获取getBean

相当于是getBean("apple"),肯定是可以获取到了

到这里还看不出lookup-method的作用

改下配置:

继续查看,可以看到一级缓存中并没有apple对象

开始getBean("apple")了

可以看到进入了原型模式

创建了对象1793

创建对象1897,每次都是新的不同对象

如果到这里还是看不出来,再举个例子

是同一个对象吧

如果想解决这个问题也很简单

看结果:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值