当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

Spring 2.0中新的Bean典范实现原理[Java编程]

赞助商链接



  本文“Spring 2.0中新的Bean典范实现原理[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

我们知道,在Spring2.0中,除了singleton及prototype两种范例的Bean以外.默许情形下还增添了request、session及global session三种范例的Bean,增添的三种范例的Bean主要利用于Web利用程序中.本文不打算解析三种范例的Bean的用法,只是简单解析框架的实现原理.

Spring2.0中新增了一个用来表示Bean范围的Scope接口

public interface Scope {
 Object get(String name, ObjectFactory objectFactory);//按照名称及成立工厂得到一个Bean实例
 Object remove(String name);//删除一个指命名称的Bean
}

在容器ConfigurableBeanFactory接口中定义了Bean工厂有关Scope注册的相关办法,使得可往Bean工厂中加入新范例的Bean.

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory,
 void registerScope(String scopeName, Scope scope);//往Bean工厂中增添一个新的范围(默许只有两种范围:  singleton及prototype)
 void destroyScopedBean(String beanName);//销毁B ean工厂中范围Bean
}

在AbstractFactoryBean的getBean办法中实现了对特定Scope Bean支持,核心代码择要:

String scopeName = mergedBeanDefinition.getScope();
 //获得当前Bean的范围,也即在定义中的scope=”request”的部份.
 Scope scope = (Scope) this.scopes.get(scopeName);//得到Bean工厂中的范围处理器
 if (scope == null) {
  throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");
 }
 try {
  //利用scope.get(beanName,ObjectFactory)从指定的范围中得到或成立Bean实例
  Object scopedInstance = scope.get(beanName, new ObjectFactory() {
   public Object getObject() throws BeansException {
    beforePrototypeCreation(beanName);//前拦阻
    try {
     return createBean(beanName, mergedBeanDefinition, args);
     //调用子类的createBean实现真正的Bean成立工作
    }
    finally {
     afterPrototypeCreation(beanName);//后拦阻
    }
   }
  });
  bean = getObjectForBeanInstance(scopedInstance, name, mergedBeanDefinition);//返回精确范例的Bean实例
 }
 catch (IllegalStateException ex) {
  throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active", ex);
 }

默许情形下,低层的Bean工厂中只支持singleton及prototype两种范例的Bean.当把scope设置成request及session时将会呈现不能精确辨认Scope的错误.这是因为普通的Bean工厂都没有注册新的Scope.只有在WebApplicationContext中注册才注册了新范例的Bean.

下面看实现注册Scope的代码:

在WebApplicationContext中定义常量

public interface WebApplicationContext extends ApplicationContext {
 String SCOPE_REQUEST = "request";
 String SCOPE_SESSION = "session";
 String SCOPE_GLOBAL_SESSION = "globalSession";
}

然后在全部范例的Web利用上下文的实现中,都在Bean工厂的拦载历程中通过postProcessBeanFactory办法来注册新范例Scope,如GenericWebApplicationContext、StaticWebApplicationContext、AbstractRefreshableWebApplicationContext等WebApplication利用上下文实现中.

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
 beanFactory.registerScope(SCOPE_REQUEST, new RequestScope());//注册request范例的Bean
 beanFactory.registerScope(SCOPE_SESSION, new SessionScope(false));//注册session范例的Bean
 beanFactory.registerScope(SCOPE_GLOBAL_SESSION, new SessionScope(true));//注册glogalsession的Bean
}

结合上面的代码,目前应当懂得为什么只有在Web利用上下文中才能利用新增添三种范例的Bean了吧.当然,由于有了Scope,我们也可以非常轻松的实现我们自己的Scope,增添新用户自定义范例的Bean,然后计划出一个合适我们自己的Bean工厂.


  以上是“Spring 2.0中新的Bean典范实现原理[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 在Ubuntu管理iPhone/iPod SpringBoard图标
  • Visual C++ sprintf()函数用法
  • 发扬EJB、Spring思惟将组件化举行到底
  • spring在MVC层办理JPA的缓迟加载问题
  • 用spring简单实现发送邮件
  • 用Spring framework实现按时器功效
  • 关于Struts和Spring两种MVC框架的比较
  • Spring自动装配的学习
  • Spring事件配置的五种办法
  • Spring编程入门十大问题解答
  • Hibernate+Spring+Struts扩大Struts
  • J2EE新手入门之"Spring"名词注释
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .