JSR 365更新:深入CDI 2.0

上下文和依赖注入2.0( JSR 365 )是CDI 1.2的更新,CDI 1.2目前是Java EE 7平台的一部分。 目前处于公开审查阶段 。 对于不熟悉CDI的那些人,它定义了一组功能强大的免费服务,这些服务可充当凝胶,帮助改善应用程序代码的协调性和结构。 有关更多详细信息,请访问规格页面

CDI 2.0也将上下文和依赖注入服务的可用性扩展到Java SE,因为它现在将同时面向Java SE和Java EE平台。 CDI规范分为三部分, 第一部分-核心CDI第二部分-Java SE中的 CDI第三 部分-Java EE中的CDI 。 CDI 2.0的主要更改如下:

  • 与Java SE 8更好地结合
  • 用于在Java SE应用程序中引导CDI的API
  • 提供观察者订购的能力
  • 能够触发异步事件
  • 服务提供商接口(SPI)元素的新配置器接口
  • 能够在ProcessObserverEvent事件中配置或否决观察者方法
  • 支持特定注释类型的内联实例化
  • 增加了InterceptionFactory接口,该接口允许创建一个包装实例,该包装实例的方法调用被方法拦截器拦截并转发到提供的实例。

我鼓励您查看CDI 2.0公共审查草案,以详细了解列出的每个增强功能的详细信息以及新功能的完整列表。 通读草案并向专家组提供反馈。 有关提供反馈的所有相关详细信息,请参见JSR 365页面 。 要开始测试,请在您喜欢的IDE中创建一个新的基于Maven的Java EE应用程序,并添加以下依赖项:

<dependency>

<groupid>javax.enterprise</groupid>

<artifactid>cdi-api</artifactid>

<version>2.0-PFD</version>

</dependency>

<dependency>

<groupid>org.jboss.weld</groupid>

<artifactid>weld-core-bom</artifactid>

<version>3.0.0.Alpha14</version>

<type>pom</type>

</dependency>

在本文中,我们将深入探讨其中的一项新功能,以帮助您开始使用API​​。 让我们看一下异步事件。 在CDI 2.0之前,只能以同步方式触发事件。 在用于异步处理的最新迭代中对它们进行了增强。 运作方式如下:

创建某种类型的事件。 接下来,以异步方式触发事件,并在事件完成后进行相应处理。 在此示例中,我创建了MovieEvent类,每当Movie对象发生持久事件时都将使用该类。 MovieEvent类如下:

public class MovieEvent {
    
    private String message;
    private Movie movie;
    
    public MovieEvent(String message, Movie movie){
        this.message = message;
        this.movie = movie;
    }
    
    public String getMessage(){
        return this.message;
    }
    
    public void setMessage(String message){
        this.message = message;
    }
    
    public Movie getMovie(){
        return this.movie;
    }
    
    public void setMovie(Movie movie){
        this.movie = movie;
    }
    
}

在以下情况下,当新的电影持续存在时,我们将触发一个事件。 以下代码位于示例JSF应用程序的MovieController CDI bean中:

@Named("movieController")
@SessionScoped
public class MovieController implements Serializable {

    @EJB
    private com.mycompany.cditest.session.MovieFacade ejbFacade;
    private List items = null;
    private Movie selected;
    
    @Inject
    Event<MovieEvent> movieEvents;
. . .
   private void persist(PersistAction persistAction, String successMessage) {
        if (selected != null) {
            setEmbeddableKeys();
            try {
                if (persistAction != PersistAction.DELETE) {
                    getFacade().edit(selected);
                    movieEvents.fireAsync(new MovieEvent("New Movie Released", selected))
                            .whenComplete((event, throwable) -> {
                                if(throwable != null){
                                    System.out.println("Error has occurred: " + throwable.getMessage());
                                } else {
                                    System.out.println("Successful Movie Processing...");
                                }
                            });
                } else {
                    getFacade().remove(selected);
                }
                JsfUtil.addSuccessMessage(successMessage);
            } catch (Exception ex) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        }
. . .

触发事件时,它将创建一个新的MovieEvent对象,如果成功完成,则将显示一条消息以指示成功。 在此示例中,流用于处理“ whenComplete”动作。

随时克隆位于https://github.com/juneau001/CdiTest的存储库,并进行CDI 2.0测试。 此示例只是CDI 2.0的一个简单测试。 您可以克隆并利用此测试项目作为与规范其他方面一起工作的起点。 请密切注意目前处于“公开审核”投票阶段的JSR 365。

翻译自: https://www.javacodegeeks.com/2017/03/jsr-365-update-digging-cdi-2-0.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值