从JBoss中的依赖拒绝中排除/删除服务

时间:2011-04-21 11:59:50

标签: java jboss dependency-injection

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

一个简短的例子:

在基础库中我们有:

@Stateless
@Local( IUserService.class ) 
public UserServiceBean implements IUserService {
  public void login(String user, String password) {...}
}

在应用程序中,我们需要覆盖login(...),因此我们有:

@Stateless
@Local( { ISpecificUserService.class, IUserService.class } ) 
public SpecificUserServiceBean extends UserServiceBean implements ISpecificUserService {
  public void login(String user, String password) { ... } //override
}

如果我现在在应用程序中有另一个需要引用SpecificUserServiceBean的EJB,我会@EJB ISpecificUserService userService;

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

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

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

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

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

您对我们的工作有什么想法吗?

提前致谢。

顺便说一句,我们正在使用EJB 3.0开发JBoss 4.2.3。

1 个答案:

答案 0 :(得分:1)

问题是你的应用程序部分在基础库中连接是不好的,因为你无法覆盖这种连线。

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

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

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

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