2015-05-06 210 views
0

如果我已經配置Spring + Hibernate的下面,注入Spring管理的SessionFactory的bean在JSF託管bean

<!-- Hibernate session factory --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
<property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.format_sql">true</prop> 
     <prop key="hibernate.current_session_context_class">thread</prop> 
    </props> 
</property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean id="transactionManager" 
class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="persistenceExceptionTranslationPostProcessor" 
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

如何注入春季會議工廠bean到我的JSF託管bean?

回答

1

只要您使用ContextLoaderListener初始化了您的Spring上下文,就可以從JSF上下文訪問它。根據文檔:

所有Java Web框架都構建在Servlet API的頂部,因此可以使用下面的代碼片斷訪問到的ApplicationContext由ContextLoaderListener創建了這個「業務環境」。

WebApplicationContext ctx = WebApplicationContextUtils. 
    getWebApplicationContext(servletContext); 

春天也有搶從JSF上下文豆的隱式方法:

ApplicationContext ctx = FacesContextUtils 
    .getWebApplicationContext(FacesContext.getCurrentInstance()); 
//Retrieve the bean by class or id 
ctx.getBean("sessionFactory"); 

記住那種豆查找是針對DI規則。不要在你擁有的每一個bean中執行它,它會降低它們的可測試性。相反,使用託管bean(您可以輕鬆地進行單元測試)來返回Spring上下文。

參見: