通常,如果我必须在Spring中注入服务,请使用
<bean id="mycontroller" class="com.MyController">
<property name="myService" ref="myService" />
和
<bean id="myService" class="com.MyService"></bean>
使用JSF时如何做同样的事情?我不想为bean使用两个IOC容器,而是将它保存在faces context本身。我见过像
这样的链接JSF 2 inject Spring bean/service with @ManagedProperty and no xml
和A problem about injecting spring bean into jsf bean。他们谈论将Spring托管bean注入JSF上下文。 我想要做的事情必须非常简单,但无法找到任何相关信息。我是新手,会感激任何帮助。
答案 0 :(得分:6)
我想你可能会对“豆”这个词感到困惑。 问题是,你所谈论的“服务”也是一个Spring bean,对吗?
根据您的配置,您可能将它作为一项服务,因为它有一些Spring添加的附加功能(可能是事务管理)。
JSF IoC容器非常简单,它不允许您将其生命周期配置为包括事务管理,AOP等。那些与Spring(或EJB,在Java EE环境中)有关的事情。
因此,在使用Spring的JSF时,通常有两种选择:
@ManagedBean
,@RequestScoped
,@ViewScoped
等注释它们;并在属性中注入任何必需的带有@ManagedProperty
的Spring bean(需要一个setter)@Component
,@Scope("request")
注释它们,{ {1}}并注入@Scope("session")
,@Autowired
等。就个人而言,面对这个选择,我会选择第一个选择,因为它会给你@Qualifier
和其他一些细节。这是真的,它使用了两个IoC容器但是,那个Java EE应用程序没有?
如果你想要第二条路线,你也可以add a view scope for Spring beans, backed by JSF viewMap。
答案 1 :(得分:2)
Spring称之为&#34;服务&#34;在Java EE术语中是&#34; EJB&#34;。 EJB可以在像Glassfish,JBossAS和TomEE这样的Java EE Web配置文件容器中使用。
要创建无状态EJB服务,只需在类上使用@Stateless
:
@Stateless
public class SomeService {
public void doSomething() {
// ...
}
}
要将其注入JSF托管bean,只需在要注入的属性上使用@EJB
:
@ManagedBean
@ViewScoped
public class SomeController {
@EJB
private SomeService service;
}
那就是它。不需要吸气剂/固定剂。没有必要的XML样板。