了解Jakarta EE 8 - C.D.I. 第三部分 - 定义自定义CDI注释

294 阅读4分钟

DZone>Java Zone > 了解Jakarta EE 8 - C.D.I. 第三部分 - 定义自定义CDI注释

了解Jakarta EE 8 - C.D.I. 第3部分 - 定义自定义CDI注解

在本教程中,我们将发现如何创建新的限定词和定型注释,以便在你的CDI JakartaEE代码库中使用。

BUHAKE SINDI user avatar作者

布哈克-辛迪

CORE -

21年8月6 日 -Java区 -教程

喜欢 (1)

评论

保存

Tweet

3.07K浏览次数

加入DZone社区,获得完整的会员体验。

免费加入

[随着本系列的继续,我们将参考CDI 2.x规范中的一些内容和例子]。

CDI规范允许开发者灵活地创建在bean类型声明范围内的新类型。
在这个例子中,我们将研究和学习如何轻松地创建自定义CDI注释,以定义。

  • 新的限定词类型。
  • 新的定型。

定义新的限定符类型

一个限定符类型是一个定义为@Retention(RUNTIME) 的Java注解。通常一个限定符类型被定义为@Target({METHOD, FIELD, PARAMETER, TYPE})

定义一个限定符类型可以通过指定@javax.inject.Qualifier 元注解来声明。

在我们的例子中,我们已经创建了2个服务定义的限定器类型,@Jabbawockee@LesTwins 限定器。

@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
public @interface Jabbawockee {

}
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
public @interface LesTwins {

}

而Bean是通过对Bean类或生产者方法或字段进行注解来限定的。

@Jabbawockee
public class JabbawockeeService implements Service {

	public void doWork() {
		System.out.println("Jabbawockee doing the work.");
	}
}

定型

JavaEE规范对定型的规定如下。

定型是一种注解,适用于Bean,它包含了其他的注解。定型在大型应用中特别有用,
,你有许多执行类似功能的bean。

企业Java开发者所熟知的一个著名的定型来自Spring框架:@Component@Service@Repository 定型。

定型是一个注解,注解为@Stereotype(@javax.enterprise.inject.Stereotype),它封装了其他几个注解。例如,在你的JavaEE应用程序中重新创建Spring框架的3个定型。

@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
@Documented
@Named
public @interface Component {}

请注意,我们的Component 定型已经用一个空的@Named 注释来声明,它指定了当Bean没有明确指定名称时,每个具有该定型的Bean都有一个默认的名称。定型所声明的@Named 修饰语不会被添加到具有该定型的bean的修饰语中。

如果一个刻板印象声明了一个非空的@Named 注释,容器会自动检测到这个问题并把它当作一个定义错误。

@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
@Component //Note that Spring specifies that this annotation is a specialization of Component annotation.
public @interface Service {}
@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
public @interface Repository {}

通过用拦截器绑定类型注释定型,可以用拦截器绑定指定定型。例如,为了拥有一个事务性的业务服务,我们可以用@Transactional 来注释我们的Service 定型。

@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
@Transactional
@Component
public @interface Service {}

另外,通过用范围类型来注解一个定型,可以定义定型的默认范围。一个定型最多可以声明一个作用域。如果一个刻板印象声明了一个以上的作用域,容器会自动检测到这个问题并把它当作一个定义错误。

例如,在我们的Controller 定型中,我们可以指定有一个默认的@RequestScoped 范围类型。

@RequestScoped
@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
@Documented
@Named
public @interface Component {}

内置的定型

CDI框架为我们提供了一个内置的定型@javax.enterprise.inject.Model ,该定型用于定义MVC Web应用架构(如Jakarta Server Faces)_模型_层的bean。

@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Model {}

在下一篇文章中,我们将研究生产者(生产者方法和生产者字段),使用@Produces 和装饰者进行注入,使用@Decorator 注解。

主题。

java(编程语言), javaee8, jakarta ee 8, java, 教程

DZone贡献者所表达的观点属于他们自己。

DZone上的热门话题


评论

Java 合作伙伴资源