php cdi
在愉快地围绕CDI构建我的代码几年之后,使用它根据众所周知的模式来构造我的代码非常自然。 CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利。 但是,我想证明它可以在Java SE应用程序中使用并且具有巨大的潜力。
CDI的优点在于,它不仅仅是注入机制。 除此之外,它还提供了一种优雅而强大的事件传递机制。 该功能可以与Swing很好地结合起来,以基于MVC模式构建GUI应用程序。
确实有可能有效地将CDI和Swing框架结合起来,以快速,清晰的结构来构建Java GUI应用程序。 请继续关注以了解如何…
首先,称为Weld的CDI参考实现也作为独立的库分发。 您可以将其添加到您的项目中并开始使用它。 与运行应用程序的标准方式唯一的不同是,您需要启动一个Weld容器,它很简单:
import org.jboss.weld.environment.se.StartMain;
...public static void main(String[] args) { StartMain.main(args);}
要将Weld添加到您的Maven应用程序中,只需添加以下依赖项: org.jboss.weld.se : weld-se : 2.2.9.Final 。 要执行您的应用程序代码,应将其放入观察ContainerInitialized事件的方法中:
public void start(@Observes ContainerInitialized startEvent) {// code which would be usually in the main() method
}
在上面的方法中,您可以初始化应用程序,构建并显示GUI并等待Swing事件。
从这里开始有趣的部分。 我将使用CDI事件机制使用观察者模式在Swing组件和模型之间实现绑定。 这个想法是在应该进行数据更新时触发自定义事件,而不是直接修改数据。 控制器观察触发的事件并根据事件数据执行操作。 然后,这些操作将操纵数据模型,并将有关数据更新的通知发送到视图。 参见下图:
MVC周期从Swing动作侦听器开始,该动作侦听器构成一个动作对象并将其作为CDI事件发出。 动作侦听器未绑定到任何控制器代码–控制器已使用CDI机制绑定到事件。 这将GUI代码与业务逻辑完全分离。 以下代码段响应按钮单击事件,并发出一个向计数器添加值的操作:
@ApplicationScoped
class MainFrame extends javax.swing.JFrame {@Inject Event<ChangeValueAction> changeValueAction;
...void addButtonActionPerformed(java.awt.event.ActionEvent evt) {changeValueAction.fire(ChangeValueAction.plus(getValue()));}
...
}
在这里,我们需要记住,CDI事件的观察者将被创建为所有触发事件的新对象以及所有依赖项。 我对MainFrame使用了@ApplicationScoped ,以确保所有代码都在相同的实例上运行。
这里要提到的一件事:为了使CDI工作,必须由CDI创建MainFrame的实例,而不是直接使用其构造函数。 这是通过将其注入到现有的bean中实现的,例如观察启动时发出的ContainerInitialized事件的bean。
CDI机制将事件分派给任何侦听器方法,该方法侦听此类事件。 我们创建一个控制器应用程序,并将代码放入观察者方法中,如下所示:
public class Application {
...public void updateValueWhenChangeValueAction(@Observes final ChangeValueAction action) {... // controller action}
...
}
最后,控制器更新模型,并在必要时触发视图更新。 如果进一步讲,我们可能会触发控制器的更新事件,该事件将由视图(在本例中为MainFrame组件)观察到。 甚至构建模型,该模型在更新时会自动触发CDI事件。 因此,控制器和视图将完全分离,仅响应事件-GUI事件从View到Controller方向流动,而数据更新事件从Controller / Model到View流动。总而言之,CDI事件机制对于构建非常方便一个View与业务逻辑分离的MVC Swing应用程序。 这可以通过在Weld CDI容器中运行应用程序(1行代码),从Swing侦听器触发动作(2行代码)并观察动作(在任何启用CDI的类上使用单个方法)来实现。 这些动作采用一种数据Bean的形式,它本身完全不是太多的代码行。
- 可以在github上找到完整的示例: https : //github.com/OndrejM/JavaDecoupledUI-CDI
翻译自: https://www.javacodegeeks.com/2016/02/cdi-events-swing-application-decouple-ui-event-handling.html
php cdi