除了管理用户会话之外,CDI在JavaSE/EE中的作用是什么?

除了管理用户会话之外,CDI在JavaSE/EE中的作用是什么?,java,cdi,Java,Cdi,我理解CDI在javaeeweb应用程序中的作用,它们帮助在bean之间传递用户会话数据。 在没有用户会话的情况下,在Java SE或Java EE应用程序中使用CDI是否有充分的理由?以下是Java SE应用程序中使用Java EE CDI的一些用例 1事件总线 public void someMethod(@Observes @SomeFilter(SomeContext.SOME_FLAG) SomeEvent event) { .... 2种模式 @Produces @Dependen

我理解CDI在javaeeweb应用程序中的作用,它们帮助在bean之间传递用户会话数据。
在没有用户会话的情况下,在Java SE或Java EE应用程序中使用CDI是否有充分的理由?

以下是Java SE应用程序中使用Java EE CDI的一些用例

1事件总线

public void someMethod(@Observes @SomeFilter(SomeContext.SOME_FLAG) SomeEvent event) { ....
2种模式

@Produces
@Dependent
@ChartCanvasResult(DataFlow.CTS_FLOW)
Canvas canvasChart;

@Inject
@ModelResult(SomeContext.SOME_FLAG)
List<Double> someDataSinkList;

@Dependent
@Named("SomeService")
class SomeServiceImpl  implements SomeService {
4运行时上下文

   public Object call(Class<?> clazz) {
    log.debug("creating controller= {}", clazz.getSimpleName());

    try {
        return WeldSe.get(clazz);
    } catch (Exception e) {
        log.error("Error creating controller= " + clazz, e);
        throw new RuntimeException(e);
    }
}
公共对象调用(类clazz){
debug(“创建控制器={}”,clazz.getSimpleName());
试一试{
返回WeldSe.get(clazz);
}捕获(例外e){
log.error(“错误创建控制器=“+clazz,e”);
抛出新的运行时异常(e);
}
}
1到4允许我使用企业模式管理引导、运行时对象图、关闭和布局代码。

似乎对CDI是什么存在误解。我将解释它是什么,然后介绍一些用例及其好处


什么是CDI?

CDI代表“上下文和依赖注入”。它是用于依赖注入的JEE框架。有关更多信息,请访问。我跳过了依赖注入的解释,感兴趣的读者可以查找它,例如


依赖注入有哪些好处?

部署依赖项注入的主要好处是减少了摩擦:通过将依赖项注入到类中,类与其依赖项解耦,并且可以在不更改代码的情况下交换依赖项。我在文章中给出了一个深入的例子

依赖注入还可以导致更干净的体系结构:定义REST端点的类注入必要的服务。作为回报,服务将注入必要的存储库/DAO。三层体系结构是最典型的,但不一定是唯一正确的形式。但是,请记住,体系结构是

  • a) 活动,即随着项目的发展而变化
  • b) 应该始终由项目团队决定或至少讨论的事情。如果团队不喜欢该架构,它将不会遵循它,从而使它变得无用
  • c) 主观尺度。很少有人会发现一种架构是最好的架构。大多数时候,这是一个品味的问题
和是基于依赖注入的主要部分的架构/原则的示例

少耦合带来的另一个好处是更好的可测试性。例如,通过注入依赖项的模拟,可以单独测试单个服务


结束语

权力越大,责任越大。软件工程并不是将一切与其他一切分离。在大多数情况下,它决定哪里需要解耦,哪里需要耦合。太多的抽象和分离会导致难以维护的不可读的混乱。举个例子:尽管我非常喜欢CDI事件,但它们往往会模糊业务逻辑的实际工作流,尤其是在多个位置触发和观察事件时


在技术方面,应避免现场注入。DI框架必须采用反射,以使现场注入可行。单凭这一点就应该成为交易的破坏者。此外,类的依赖关系变得模糊。如果添加或删除了依赖项,那么仍然会创建bean,可能会在另一个bean应该存在的位置使用
null
值。setter注入也是如此。这就是为什么构造函数注入被认为是三种方法中最干净的方法。

CDI代表“上下文和依赖项注入”。整个依赖项注入都基于CDI(例如,您用
@Inject
注释的所有内容都由CDI处理)。它的用途是什么?“它的用途是什么?”——。当然,除了管理有状态会话之外,还有依赖项注入的用例吗?@hc\u dev。
   public Object call(Class<?> clazz) {
    log.debug("creating controller= {}", clazz.getSimpleName());

    try {
        return WeldSe.get(clazz);
    } catch (Exception e) {
        log.error("Error creating controller= " + clazz, e);
        throw new RuntimeException(e);
    }
}