假设一个组件(即jar文件) FeedbackAPI 带有接口
public interface Feedback {
String giveFeedback();
}
和使用该界面的另一个组件(即jar文件) FeedbackUser :
public class FeedbackCollector {
@Inject Feedback feedback;
...
}
有两个实现
@Alternative
public class GoodFeedback implements {
String giveFeedback() { return "good"; }
}
@Alternative
public class BadFeedback implements {
String giveFeedback() { return "bad"; }
}
要选择要使用的实现,我想在我的webapp的beans.xml中选择替代方案,而不要触及FeedbackUser的beans.xml。但这只有在我转向bean存档隔离时才有可能。
转换bean归档隔离是否有任何缺点?
答案 0 :(得分:0)
正如我们在评论中所讨论的那样,实际(并且从CDI角度来看)正确的解决方案是将beans.xml
添加到您的FeedbackUser
组件中并在那里启用替代方案。
回到关于平面部署的原始问题......
缺点是你不能通过以每个归档的方式限制bean来细化你的部署(例如,你不能在一个归档中启用拦截器/装饰器/备选,而在另一个归档中禁用它们)。您可能还会注意到,您的扩展程序的行为会有所不同,因为观察者可能会收到有关其他事件的通知(否则这些事件将保持不变"对于他们而言)。并且可能存在其他差异,您的里程可能会因您的设置而异。
以这种方式思考 - 就好像你采用了所有架构,工具库,WAR部署,后端处理库,并将其压缩回一个(bean)存档。如果您使用平面部署,那就是CDI如何看待它。
为什么要介绍?对于某些情况,测试是一个,这可能很方便。其他用例类似于您所拥有的但没有能力修改beans.xml
- 在这种情况下您无法启用它。您可以使用平面部署来处理启用(以及其他事项)。它不是一个常见的用例,如果可以的话,您应该仍然坚持原始的结构化部署。