现在的项目是Jsf+Hibernate+Spring+Birt(报表)构成的.但由于Birt没有纳入Jsf的管理因而当遇到Hibernate的延迟加载时会报session关闭错误.解决方法是(自己的理解,说的不定对):
//findBean是Spring提供的方法,通过Name获得配置文件的Bean.由于Spring在项目初始化时就已经注入好,因而拿来使用即可
public Object findBean(String beanname, ServletContext context) {
ApplicationContext appctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(context);
return appctx.getBean(beanname);
}
//sessinBindThread:这是问题解决的关键由于没纳入Jsf管理,Spring是不会自动在请求时生成Session并绑定其上的,而以下就是手动绑定Session.
public void sessionBindThread(ServletContext context) throws Exception {
SessionFactory factory = (SessionFactory) findBean(
"FactoryName", context);
Session sInfo = SessionFactoryUtils.getSession(factory, true);
if(TransactionSynchronizationManager.getResource(factory) == null){
TransactionSynchronizationManager
.bindResource(factory,new SessionHolder(sInfo));
}
}
//请求之后要解绑!!
public void sessionOutThread(ServletContext context) throws Exception {
SessionFactory factory = (SessionFactory) findBean(
"FactoryName", context);
SessionHolder holderInfo = (SessionHolder) TransactionSynchronizationManager
.getResource(factory);
if(holderInfo!=null){
Session s = holderInfo.getSession();
s.flush();//不想提交用s.clear()
TransactionSynchronizationManager.unbindResource(factory);
SessionFactoryUtils.releaseSession(s, factory);
}
}
备注:这里的ServletContext是接口,它对web容器来说定义了servlet环境对象(看字面意思是servelet上下文).对Jsf来说拿到它的方法为
ServletContext context = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
在读到Hibernate文档时说过SessionFactory创建代价很高,session相对较小,不过这个findBean是返回已有对象,而且由于Spring对项目来说,他的创建都追寻单例模式,对于sessionfactory应该不耗资源
分享到:
相关推荐
在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean spring 获取bean
在Spring框架中,管理Bean的方式主要有三种:XML配置、注解配置和Java配置。下面将详细介绍这三种方式以及Spring的自动注入机制。 1. **基于XML的Bean定义**: 在XML配置中,我们通常在`applicationContext.xml`...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
在本文中,我们将深入探讨Spring中的Bean配置,包括IoC和DI的概念,Bean的配置方式,以及不同类型的IOC容器。 **Spring的Bean配置**: 在Spring中,Bean是应用中的对象,它们由Spring IoC容器负责创建、管理和装配...
在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
Spring 的bean的作用域总结,详细的总结了 Spring 的bean的作用域
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
在Spring框架中,注解是实现依赖注入(Dependency Injection,DI)的重要手段,极大地简化了代码的编写和管理。线程中的操作往往涉及到多线程环境下的资源共享和管理,因此,如何在线程中正确地获取并使用Spring通过...
本示例将深入探讨如何在Spring中创建和管理Bean。首先,我们需要理解Spring的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)原理,这两个概念是Spring框架的核心。 **控制反转(IoC...
在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...
在Spring框架中,Bean的配置与管理是其核心功能之一,而通过`PropertyPlaceholderConfigurer`进行属性占位符的配置则是实现动态配置的关键技术。本文将深入解析如何利用`PropertyPlaceholderConfigurer`进行bean配置...
解决这个问题的关键在于深入理解Spring的Bean生命周期和配置机制,检查配置文件、注解使用、依赖关系等,确保每个Bean的定义都是唯一的,且作用域设置正确。同时,对源码进行调试也是一个有效的排查手段,可以追踪到...
2. **注解驱动的Bean定义**:随着Spring的发展,更多地使用注解来进行Bean的定义和配置,如`@Component`、`@Service`、`@Repository`和`@Controller`等。这些注解表明类是一个Spring Bean,同时可以配合`@Autowired`...
Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...
spring-bean 源码依赖的jar包,用于spring源码部署的时候使用
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的...通过上述机制,我们可以在Spring应用运行时灵活地增加或修改Bean的定义,极大地增强了Spring框架的灵活性和扩展性。
spring动态向容器中添加bean和删除指定bean,不需要重启应用
总结,Spring框架通过BeanFactory和ApplicationContext提供了灵活的方式来管理和获取Bean。开发者可以根据应用需求选择合适的方式,从XML配置到注解注入,再到基于Java的配置,Spring都提供了全面的支持。理解这些...