CDI上的生命周期对象

173 阅读3分钟

CDI上的生命周期对象[视频]

本视频将详细介绍CDI对象的生命周期,你可以利用这个强大的框架来控制对象/资源。

当我们谈论一个系统 的OOP时,我们很自然地,与对象一起工作:这些对象存在于内存中,直到你销毁它们。对象 生命周期例程 允许创建和销毁对象引用。

在企业系统架构设计中,我们可以想象几种情况,比如一个@Connection 实例,当我们创建一个实例,需要打开连接,然后不需要这个实例。我们可以关闭,然后销毁它。

生命周期 与对象相关的 方法 将使你能够控制对象被创建或销毁时的情况。我们可以把一个对象的生命分成三个阶段:开始、使用和废弃。

CDI 允许你创建和处理对象。默认情况下,CDI会使用构造函数创建一个实例;但是,有时候,没有理由这样做。因此,我们有@Vetoed 注解来教导CDI不要使用这种方式。

@Vetoed
public class Music {

    private String sing;

    Music() {
    }

    public Music(String sing) {
        this.sing = sing;
    }

    public void play() {
        System.out.println("Playing the music: " + sing);
    }

    public void stop() {
        System.out.println("Stop sinning the music: " + sing);
    }

    @Override
    public String toString() {
        return "Music{" +
                "sing='" + sing + '\'' +
                '}';
    }
}

CDI很出色,我会很快学会它。另一方面,我们很难教CDI用不同的方式来创建一个对象。它不仅对我们在同一个包或项目中设计的实体有意义,而且对与已经存在的库的集成也有意义。

为了使之成为可能,CDI提供了一个@Produces 注释,在这里它将向CDI解释,当容器内的人需要这个实例时,要使用它。如果你熟悉Spring,这就类似于在平台内部结合两个注解:@Bean@Configuration

作为一个对象,一个CDI里面的管理豆,我们可以表达这个对象的生命周期。我们需要把之前学过的CDI注解@Scoped ,放在Producer方法上:

  • RequestScoped
  • ApplicationScoped
  • SessionScoped
  • ConversationScoped

一个很好的例子是一个使用 money-API的系统 ,我们想定义一种对整个系统可用的货币。对客户来说,知道系统使用哪种货币或这种货币来自哪里是没有意义的。它只需要注入,然后使用这种货币。

解决方案是探索生产者的权力,使其对整个系统不受限制。

class CurrencySupplier {

    private CurrencyUnit currency;

    @PostConstruct
    public void setUp() {
        this.currency = Monetary.getCurrency("EUR");
    }

    @Produces
    CurrencyUnit getCurrency() {
        return currency;
    }

    void close(@Disposes CurrencyUnit currency) {
        System.out.println("We don't need this currency: " + currency);
    }
}

一个对象生命周期的最后一步是它的死亡:例如,当连接或任何资源需要被关闭时。

CDI有@Disposes 注解,相比之下,与@Produces 相反。因此,我们用@Produces 来建立,用@Dispose 来销毁。

这个视频将解释更多关于CDI的对象生命周期的细节,在这里你可以利用这个强大的框架来控制对象/资源的好处。我们将解释如何用@Vetoed 注释来忽略Bean,并分别用@Produce@Dispose 注释来建立和销毁。