在我问的另一个问题中,提出了 spring 框架不是类型安全的担忧。它是真的,还是固定的,你能举例说明它的确切含义吗?
3 回答
首先,“类型安全”对于依赖注入框架意味着什么。我能想到的是,您可以通过指定类型从上下文中获取 bean,而不仅仅是 bean 名称。Spring 3 允许这样做。
否则,类型安全意味着您可以按类型定义依赖项。您可以在所有版本的 spring 中执行此操作。
另一件事是编译时安全。使用 spring pre-3.0 时,您必须通过使用基于字符串的名称来区分共享相同接口(或超类型)的两个 bean。在 spring 3.0 中,您可以使用基于注释的限定符(使用javax.inject.Qualifier
),因此它在编译时也更安全。
另一件要提到的是泛型的使用。你可以有,例如@Inject List<MyService>
在春天。
使用@Qualifier 定义自定义注解
要在不指定名称的情况下识别注入的 bean,我们需要创建一个自定义注解。这是在 CDI 中使用 JSR 330 注释(注入)的等效过程。
@Target({ElementType.Field, ElementType.Parameter})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @Interface Student {
}
现在将此自定义注释分配给 EntityDao 接口的实现
@Component
@Student
public class StudentDao implements EntityDao {
}
@Component 告诉 Spring 这是一个 bean 定义。每当使用 EntityDao 的引用时,Spring IoC 使用 @Student 注解将 StudentDao 标识为 EntityDao 的实现。使用 @Autowired 和自定义限定符注入 bean 类似这样的东西。
@Autowired
@Student
private EntityDao studentDao; // So the spring injects the instance of StudentDao here.
这减少了对可能拼写错误且更难维护的字符串名称的使用。- 我觉得这篇文章非常有用。 http://www.coolcoder.in/2011/08/how-to-use-type-safe-dependency.html
这取决于您如何使用它以及类型安全的含义(有关后者的更多信息,请参见 Bozho 的回答):如果您使用 xml 配置来生成 bean,那么您可能在启动后是类型安全的.
但是,如果您使用新的 Java Bean 配置(有其自身的限制),您将获得编译时安全性。
我并不是在提倡后者而不是前者,但这是需要考虑的事情。