DZone>Java Zone > 了解Jakarta EE 8 - C.D.I. 第三部分 - 定义自定义CDI注释
了解Jakarta EE 8 - C.D.I. 第3部分 - 定义自定义CDI注解
在本教程中,我们将发现如何创建新的限定词和定型注释,以便在你的CDI JakartaEE代码库中使用。
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中的TreeMap?Java中的TreeMap简介和示例程序 | Java中的TreeMap
- 2021年十大无代码测试工具
- 淘宝网上卖的是什么?哪些因素会影响你的工作?
- 设计过程中线框设计的价值
评论