Java 从JBoss中的依赖项索引中排除/删除服务

Java 从JBoss中的依赖项索引中排除/删除服务,java,jboss,dependency-injection,Java,Jboss,Dependency Injection,我们目前有一个由多个应用程序和一个基本库组成的项目。 应用程序和基本库都包含无状态EJB,每个应用程序都可能引入一个从基本库EJBand继承的EJB,从而实现相同的接口 举个简单的例子: 在基本库中,我们有: @Stateless @Local( IUserService.class ) public UserServiceBean implements IUserService { public void login(String user, String password) {...}

我们目前有一个由多个应用程序和一个基本库组成的项目。 应用程序和基本库都包含无状态EJB,每个应用程序都可能引入一个从基本库EJBand继承的EJB,从而实现相同的接口

举个简单的例子:

在基本库中,我们有:

@Stateless
@Local( IUserService.class ) 
public UserServiceBean implements IUserService {
  public void login(String user, String password) {...}
}
在应用程序中,我们需要覆盖登录(…),因此我们有:

@Stateless
@Local( { ISpecificUserService.class, IUserService.class } ) 
public SpecificUserServiceBean extends UserServiceBean implements ISpecificUserService {
  public void login(String user, String password) { ... } //override
}
如果我现在在应用程序中有另一个EJB需要引用
SpecificUserServiceBean
,我会做
@EJB-isSpecificUserService-userService

但是,如果基础库中有EJB,它将包含
@EJB IUserService userService问题是:

我们需要将应用程序中的特定服务注入基础库EJB中。但是,有两个EJB为同一个本地接口注册,这意味着容器可能返回基本EJB或特定EJB

您可以说“不要将基本库jar作为模块添加到application.xml中”,但现在这是不可能的,因为它包含需要部署的其他EJB。我们可以将要重写的EJB移动到不同的jar中,但由于几乎每个EJB都可能被重写,这取决于应用程序,因此最终每个EJB都会有一个jar

因此,如果存在特定的重写,我想从依赖项注入容器中排除或删除基本EJB。因为我知道在部署时,我还可以使用配置文件来告诉容器不要加载特定的EJB类

我可能会在之后添加一个修改容器的服务,但那将是我最后的选择

你对我们能做什么有什么想法吗

提前谢谢


顺便说一句,我们正在使用EJB3.0开发JBoss 4.2.3。

问题是,您在基本库中部分连接应用程序,这很糟糕,因为您无法覆盖此连接

因此,解决方案是从基本库中的
UserServiceBean
中删除
@Stateless@Local(IUserService.class)
;基本库只为bean提供默认实现,但不能连接它们

在应用程序中,您需要以下代码:

@Stateless
@Local( IUserService.class ) 
public AppUserServiceBean extends UserServiceBean {}

创建配线。将所有这些bean移动到一个特殊的包中,您可以将其复制到每个应用程序中,这样您就可以获得所有内容的默认连接。

问题是,您将应用程序部分连接到基本库中,这是不好的,因为您无法覆盖此连接

因此,解决方案是从基本库中的
UserServiceBean
中删除
@Stateless@Local(IUserService.class)
;基本库只为bean提供默认实现,但不能连接它们

在应用程序中,您需要以下代码:

@Stateless
@Local( IUserService.class ) 
public AppUserServiceBean extends UserServiceBean {}

创建配线。将所有这些bean移动到一个特殊的包中,您可以将其复制到每个应用程序中,这样您就可以获得所有内容的默认连接。

这也是一个解决方案。然而,这将要求我们在每个应用程序中复制所有EJB,即使它们只是用于布线。我刚刚找到JBoss 5的JBoss-scanning.xml,如果我们可以切换到JBoss 5,它可能是解决方案。有了这个文件,我们可能可以从扫描中排除基本服务,因此它们不会被部署。不过,我仍然需要对此进行测试。Spring解决了与分层相同的问题:可以在树中加载上下文,父层隐藏较低的层。如果较低的层已经创建了bean(现有bean没有注入新的、被覆盖的bean),则会中断。但是,如果你在启动时加载所有层(通常是这样),效果会很好。@Aaron这听起来是个不错的解决方案,谢谢。不幸的是,我怀疑我能否让我的老板允许从EJB3到Spring进行根本性的重组。不过,如果使用EJB3+无法做到这一点,我也许能够说服他。@Thomas:我提到了Spring作为一个例子;我不是建议你改用它,除非你不能解决问题。在这种情况下,应该考虑维护工作,而不是将应用程序的一部分转换为Spring。Spring是一种非侵入性技术。您不必放弃EJB,也不必到处使用它。这也是一个解决方案。然而,这将要求我们在每个应用程序中复制所有EJB,即使它们只是用于布线。我刚刚找到JBoss 5的JBoss-scanning.xml,如果我们可以切换到JBoss 5,它可能是解决方案。有了这个文件,我们可能可以从扫描中排除基本服务,因此它们不会被部署。不过,我仍然需要对此进行测试。Spring解决了与分层相同的问题:可以在树中加载上下文,父层隐藏较低的层。如果较低的层已经创建了bean(现有bean没有注入新的、被覆盖的bean),则会中断。但是,如果你在启动时加载所有层(通常是这样),效果会很好。@Aaron这听起来是个不错的解决方案,谢谢。不幸的是,我怀疑我能否让我的老板允许从EJB3到Spring进行根本性的重组。不过,如果使用EJB3+无法做到这一点,我也许能够说服他。@Thomas:我提到了Spring作为一个例子;我不是建议你改用它,除非你不能解决问题。在这种情况下,应该考虑维护工作,而不是将应用程序的一部分转换为Spring。Spring是一种非侵入性技术。您不必放弃EJB,也不必到处使用它。