5

在我问的另一个问题中,提出了 spring 框架不是类型安全的担忧。它是真的,还是固定的,你能举例说明它的确切含义吗?

4

3 回答 3

7

首先,“类型安全”对于依赖注入框架意味着什么。我能想到的是,您可以通过指定类型从上下文中获取 bean,而不仅仅是 bean 名称。Spring 3 允许这样做。

否则,类型安全意味着您可以按类型定义依赖项。您可以在所有版本的 spring 中执行此操作。

另一件事是编译时安全。使用 spring pre-3.0 时,您必须通过使用基于字符串的名称来区分共享相同接口(或超类型)的两个 bean。在 spring 3.0 中,您可以使用基于注释的限定符(使用javax.inject.Qualifier),因此它在编译时也更安全。

另一件要提到的是泛型的使用。你可以有,例如@Inject List<MyService>在春天。

于 2010-11-15T16:42:09.697 回答
2

使用@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

于 2013-12-27T18:14:56.443 回答
1

这取决于您如何使用它以及类型安全的含义(有关后者的更多信息,请参见 Bozho 的回答):如果您使用 xml 配置来生成 bean,那么您可能在启动后是类型安全的.

但是,如果您使用新的 Java Bean 配置(有其自身的限制),您将获得编译时安全性。

我并不是在提倡后者而不是前者,但这是需要考虑的事情。

于 2010-11-15T16:56:40.950 回答