Spring是怎样实现scope作用域支持

打印 上一主题 下一主题

主题 2175|帖子 2175|积分 6525

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表