项目中我需要根据登陆用户动态修改Spring的数据源配置,即通过实现ApplicationContextAware接口来获取ApplicationContext,并将用户对应的数据源bean覆盖这个ApplicationContext的数据源bean。在多线程的情况下,是否会发生同步问题?Spring是否做到了每个线程持有独立的一份ApplicationContext,或者说我通过实现ApplicationContextAware而获得的ApplicationContext是否经过了ThreadLocal的封装优化?
解决方案 »
- hibernate 的 sum 求和报错~!
- getHibernateTemplate多张表查询
- 大家进来说说:现在做报表都用什么工具?ireport? e表?
- my eclipse打开jsp时出现error opening the editor.(time of error:November 30,2007 1:33)的错误信息
- 关于AJAX+HIBERNATE的问题
- 我怎么也看不懂的问题~
- 高手解答!有关hibernate auto commit mode 的问题
- 关于多条记录录入的情况
- 请高手指点一下呀,有关登陆验证的问题
- 为什么我的xml用xmlspy解析是valid的,但是在程序中用DOMParser.parse(uri)解析却错误呢
- 多个进程从一个表中取数据,如何保证各个进程不取重复数据
- com.microsoft.sqlserver.jdbc.SQLServerException : 列名 stuId 无效。
AbstractBeanFactory.class@SuppressWarnings("unchecked")
protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)throws BeansException {
final String beanName = transformedBeanName(name);
Object bean; // Eagerly check singleton cache for manually registered singletons.
Object sharedInstance = getSingleton(beanName);
// 以下省略}protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}单例
protected Object getObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess) {
if (factory.isSingleton() && containsSingleton(beanName)) {
synchronized (getSingletonMutex()) {
Object object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
object = doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
}
return (object != NULL_OBJECT ? object : null);
}
}
else {
return doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
}
}