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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |