2011-04-12 104 views
1

我有一个JSF 2.0应用程序,并且我正在集成Spring,因此我可以使用hibernateTemplate。我已经咨询了关于JSF集成的Spring documentation,并已采取步骤进行设置。我的所有bean类都扩展了一个名为SuperBean的抽象超类。 SuperBean是需要的注入点,使我无需在Spring中声明所有的bean。我希望只是将其声明为abstract =“true”,并且任何扩展了SuperBean类的子类都将注入dao。在运行时它是空的。Spring没有将DAO注入到具有抽象超类的JSF托管bean中

<bean id="serviceTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
    <property name="transactionManager" ref="transactionManager"/> 
    <property name="transactionAttributes"> 
     <props> 
     <prop key="*"/> 
     </props> 
    </property> 
</bean> 
<bean id="daoServiceTarget" class="com.example.service.DaoService"> 
     <property name="mainDAO" ref="mainDAO"/> 
    </bean> 
    <bean id="daoService" parent="serviceTemplate"> 
     <property name="target" ref="daoServiceTarget"/> 
    </bean>  
    <bean id="superBean" class="com.example.beans.SuperBean" abstract="true"> 
     <property name="daoService" ref="daoService"/> 
    </bean> 

我可以简单地声明这个超类SuperBean并期待Spring注入dao吗?我不想在春季申报每个bean类。

我想替代选项(从性能角度来看)将不使用Spring bean,而是将DAO声明为@applicationScoped并使用JEE的CDI将它们注入到SuperBean类中。这会更好地表现明智吗?

回答

1

在上面的例子中,它看起来serviceTemplate提供了一个你想要的例子。请注意parent =“serviceTemplate”。你需要做一些类似于从superbean继承的东西。还有其他的选择,但是因为你在serviceTemplate中有工作代码,可能是最好的开始。然后阅读here了解更多详情:

+0

我添加了serviceTemplate bean定义。这只是春季提供的另一个抽象类。我想避免在春季定义每个bean。我的SuperBean类有一个方法setDaoService(DaoService dao){// set attr}。所有属于子类的bean都应该有DAO,因为SubBean是一个SuperBean。这可能吗? – Adam 2011-04-12 03:05:03