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方法上:
RequestScopedApplicationScopedSessionScopedConversationScoped
一个很好的例子是一个使用 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 注释来建立和销毁。