>通常,如果我必须在 Spring 中注入服务,我会使用
<bean id="mycontroller" class="com.MyController">
<property name="myService" ref="myService" />
和
<bean id="myService" class="com.MyService"></bean>
使用 JSF 时如何做同样的事情?我不想为豆子使用两个 IOC 容器,而是将其保留在面部上下文本身中。我见过这样的链接
JSF 2 注入带有 @ManagedProperty 且没有 xml 的 Spring bean/服务
和关于将春豆注入 jsf 豆的问题。他们谈到将 Spring 管理的 bean 注入到 JSF 上下文中。我正在尝试做的事情必须非常简单,但找不到任何相关信息。我是新手,将不胜感激任何帮助。
我想你可能会对"豆子"这个词感到困惑。问题是,你说的"服务"也是春豆,对吧?
您可能将其作为服务,因为它具有Spring根据您的配置添加的一些附加功能(可能是事务管理)。
JSF IoC 容器非常简单,它不允许您配置其生命周期以包括事务管理、AOP 等。这些事情你必须与Spring(或EJB,在Java EE环境中)有关。
因此,当将 JSF 与 Spring 一起使用时,您通常有两种选择:
- 要么将 JSF 页面的后备 bean 放在 JSF 容器中,用
@ManagedBean
、@RequestScoped
、@ViewScoped
等对它们进行注释;并在属性中注入任何必要的 Spring bean 和@ManagedProperty
(需要 setter) - 或者跳过 JSF 容器,将支持豆和所有其他 bean 一起放在 Spring 容器中,并使用请求/会话的 Spring 作用域,使用 Spring 的注释
@Component
、@Scope("request")
、@Scope("session")
和注入@Autowired
、@Qualifier
等来注释它们。
就个人而言,面对这个选择,我会选择第一个选择,因为它会给你带来@ViewScoped
和其他一些细节。确实,它使用了两个 IoC 容器,但是,哪个 Java EE 应用程序没有?
如果你无论如何都想走第二条路线,你也可以为 Spring bean 添加一个视图范围,由 JSF viewMap 支持。
Spring 所说的"服务"在 Java EE 术语中是"EJB"。EJB 在 Java EE Web 配置文件容器(如 Glassfish、JBossAS 和 TomEE)中开箱即用。
要创建无状态的 EJB 服务,只需在类上使用 @Stateless
:
@Stateless
public class SomeService {
public void doSomething() {
// ...
}
}
要将其注入到 JSF 管理的 Bean 中,只需在要注入的属性上使用 @EJB
:
@ManagedBean
@ViewScoped
public class SomeController {
@EJB
private SomeService service;
}
就是这样。无需吸气剂/设置器。无需 XML 样板。