首先我要澄清一下,这篇文章并不是要批评 CDI,而是要发现 CDI 设计背后的思想和假设,这将对设计任何使用 CDI 的 Web 应用程序产生明显的影响。
CDI(Java EE 6)最显着的特性之一是类型安全。Jboss Seam 的字体不安全。它使用名称来限定要注入的任何实例。像下面这样:
@Name("myBean")
public class MyBean implements Bean {
...
}
@Name("yourBean")
public class YourBean implements Bean {
...
}
在注入 MyBean 时,可以这样做:
@In
private Bean myBean; //myBean is injected
@In
private Bean yourBean; //yourBean is injected
和 Spring 的早期版本(3.0 之前),这种类型的注入发生如下:
只需在 bean 配置文件中定义 bean:
<bean id="myBean" class="com.example.common.MyBean">
...
</bean>
<bean id="yourBean" class="com.example.common.YourBean">
...
</bean>
并使用命名限定符,决定使用哪一个:
@Autowired
@Qualifier("myBean")
private Bean bean;
@Autowired
@Qualifier("yourBean")
private Bean bean;
但现在在 CDI 中,首先您需要Qualifier
为任何特定类型的对象定义自定义注释。然后使用该注释来限定该对象。归根结底,当您查看源代码时,您会发现,您浪费了大量时间来编写大量用于依赖注入的自定义注释。Java 社区正在转向注解,而将基于 XML 的配置(详细的 XML)抛在后面。有没有什么可以说服任何人认为这(自定义注释的类型安全)不是冗长的注释,而是 CDI 的一个优秀和杰出的特性?
编辑:
点,推送以突出显示
- 如果我为每个服务或 dao(每个接口)的类型安全使用自定义限定符,那么对于大型应用程序,例如拥有 1000 个或更多服务或具有多个实现的 dao 类,它会很混乱。那么对于大型应用程序,使用类型安全注入是否可行?
- 如果上述问题的答案是“否”,那么使用类型安全有什么意义呢?
- 即使为类型安全编写注释是可行的,但在大型应用程序中,是否真的值得为避免冗长的 xml配置而付出努力?
- 我什么时候需要类型安全而不是 bean 名称限定符?
对以上几点的简短讨论
- 真正需要类型安全注入的情况并不多,特别是当你有一个接口的实现时,你应该使用
@Name
它作为限定符。所以是的,在大型应用程序中,在实际需要时使用类型安全是可行的。 - 当然,类型安全是 CDI 的显着特征之一,在公认的答案中,有一个非详尽的清单列出了您可能选择使用类型安全的原因。
- 由于您是一名聪明的程序员,并且您确切地知道何时使用类型安全,因此在真正需要时绝对值得付出努力。
- 接受的答案的大部分部分都在真正讨论,我们什么时候需要类型安全,这篇文章也非常有助于理解。
感谢和快乐的编码!