马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
众所周知在Spring的Bean当中是存在两种作用域的,即单例模式与多例模式,可通过scope来指定
下面就是注册一个多例Bean
- <bean id="people" class="org.qlspringframework.beans.ioc.bean.People" scope="prototype">
- <property name="name" value="derek"/>
- </bean>
复制代码 那么什么是单例模式什么是多例模式呢?说白了其实就是与是否通过Spring的完整生命周期有关,对于单例模式的Bean,会通过完整的生命周期来创建,同时也会将Bean参加到Spring的缓存当中,再次获取会从缓存当中拿。那么多例模式就不会产生这种环境,每一次通过get()方法获取 Bean的时候都是重新创建。
下面看一下怎样实现scope作用域支持
起首Bean的作用域是通过BeanDefinition界说的,那我们就必要在其中界说相关属性,除此之外Bean的默认作用域是单例,也就是说在用户未指定的环境下应保持singleton。
BeanDefinition
- public static String SCOPE_SINGLETON = "singleton";
-
- public static String SCOPE_PROTOTYPE = "prototype";
-
- private String scope = SCOPE_SINGLETON;
-
- // 单列模式
- private boolean singleton = true;
-
- // 多列模式
- private boolean prototype = false;
-
- public void setScope(String scope){
- this.scope = scope;
- this.singleton = SCOPE_SINGLETON.equals(scope);
- this.prototype = SCOPE_PROTOTYPE.equals(scope);
- }
-
- public boolean isSingleton() {
- return this.singleton;
- }
-
- public boolean isPrototype() {
- return this.prototype;
- }
复制代码 之后就是对XML的解析过程
XmlBeanDefinitionReader
- ```java
- String beanScope = bean.attributeValue(SCOPE_ATTRIBUTE);
-
- beanDefinition.setDestroyMethodName(destroyMethodName);
- if (StrUtil.isNotEmpty(beanScope)) {
- beanDefinition.setScope(beanScope);
- }
复制代码 如许我们的基础准备就完毕了,剩下的是对实行Bean生命周期的过程举行修改
起首就是多例Bean在创建完毕后不必要参加缓存
AbstractAutowireCapableBeanFactory
- // 创建完毕后加入缓存
- if (beanDefinition.isSingleton()){
- super.addSingletonBean(beanName, bean);
- }
复制代码 其次对于多例Bean不必要提前初始化
DefaultListableBeanFactory
- /**
- * 提前实例化所有单例Bean。
- */
- @Override
- public void preInstantiateSingletons() {
- beanDefinitionMap.forEach((key,value) -> {
- if (value.isSingleton()){
- super.getBean(key);
- }
- });
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |