gpt4 book ai didi

java - Spring IoC/DI 中接口(interface)使用 @Component 注解进行注解。可能是什么原因?

转载 作者:行者123 更新时间:2023-11-30 06:28:59 27 4
gpt4 key购买 nike

有时接口(interface)会使用@Component 注解进行注解。那么我的明显推理是实现此类接口(interface)的类也将被视为组件。但如果我是对的,情况就不是这样了。

那么接口(interface)上@Component注解的目的是什么?

最佳答案

使用 @Component 注释接口(interface)对于 Spring 类很常见,特别是对于一些 Spring 构造型注释:

package org.springframework.stereotype;
...
@Component
public @interface Service {...}

或:

package org.springframework.boot.test.context;
...
@Component
public @interface TestComponent {...}

@Component未声明为继承注释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {...}

但无论如何,在加载上下文期间,Spring 通过考虑候选类中声明的注释的层次结构来发现 bean。

org.springframework.boot.BeanDefinitionLoader类(包含在 Spring Boot 依赖项中)从底层源加载 bean 定义,您可以看到以下示例 org.springframework.core.annotation.AnnotationUtils.findAnnotation() Spring 用于检索整个注释层次结构中的注释:

class BeanDefinitionLoader {
...
private boolean isComponent(Class<?> type) {
// This has to be a bit of a guess. The only way to be sure that this type is
// eligible is to make a bean definition out of it and try to instantiate it.
if (AnnotationUtils.findAnnotation(type, Component.class) != null) {
return true;
}
// Nested anonymous classes are not eligible for registration, nor are groovy
// closures
if (type.getName().matches(".*\\$_.*closure.*") || type.isAnonymousClass()
|| type.getConstructors() == null || type.getConstructors().length == 0) {
return false;
}
return true;
}
...
}

具体来说,它的意思是@Service注释本身注释为 @Component ,Spring 会考虑使用 @Service 注释的候选类作为要实例化的 bean。

所以,你的猜测是正确的:

Classes that implement such interface will be treated as components as well.

但这仅适用于作为 Java 注释的接口(interface)(例如 @Service ),而不适用于普通接口(interface)

对于 Spring 类,这种做法是有意义的(例如丰富实际的构造型),但对于您自己的 bean,使用 @Component因为接口(interface)而不是实现是行不通的,并且会带来更多的缺点而不是优点:

  • 它以同样的方式破坏了接口(interface)首先是契约的目的。它将它与 Spring 结合起来,并假设您将始终拥有该类的单个实现。
    在这种情况下,为什么要使用接口(interface)?

  • 它将类的读取分散在两个地方,而接口(interface)不需要任何 Spring 构造型。

关于java - Spring IoC/DI 中接口(interface)使用 @Component 注解进行注解。可能是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com