47

在 SpringSource 博客条目中,以下句子引用了一个原型

因为@Controller是 Spring 的@Component Stereotype 注释的特化,所以 Spring 容器将自动检测该类作为容器的组件扫描过程的一部分,创建一个 bean 定义并允许像任何其他 Spring 管理的组件一样依赖注入实例。

刻板印象这个词的用法是指什么?这是一个技术性的 Spring 术语吗?还是刻板印象只是在一般意义上使用?

4

2 回答 2

65

JavaDoc对此做了一些说明。

表示类型或方法在整个架构中的角色的注释(在概念级别,而不是实现级别)。

Merriam-Webster的名词定义是stereotype这样说的:

符合固定或一般模式的东西;尤指:群体成员共同持有的一种标准化的心理图景,它代表一种过于简单化的观点、偏见的态度或不加批判的判断

似乎是为了建议正在注释的特定类的角色。这似乎是有道理的,因为通常建议您使用 注释您的 Controller 类,使用 注释@ControllerService 类@Service,等等。

除了明显的组件扫描功能之外,Spring 建议它们为您的 AOP 需求做出很好的切入点划分。

于 2013-02-07T17:26:11.307 回答
11

这是一个技术性的 Spring 术语吗?还是刻板印象只是在一般意义上使用?

我认为 Spring 将 Stereotype 一词从现实世界借用为 Spring 的技术术语。

来自美国英语词典:

(名词)对特定类型的人或事物的广泛持有但固定且过于简单的形象或想法。

在现实世界中,我们知道一些刻板印象,例如:美国人喜欢喝咖啡。英国人喜欢喝茶。当然,并非对所有美国人或英国人都是如此。它只是对美国人或英国人的过度简化。

使用刻板印象帮助我们做出更快的决定。当你的美国朋友过来时,不要问他们“你想喝什么?” 并等待他们的回应。你可以假设他们想要一杯咖啡。

在 Spring 中,构造型帮助我们简化对象创建。您不需要定义 之间的关系Type,因为您对Type.

注意:Type在 Java 中。类是一个Type.


假设我们有这些类:

public abstract class Friend {

    public abstract String favoriteDrink();
}

public class American extends Friend {

    @Override
    public String favoriteDrink() {
        return "Coffee";
    }
}

没有刻板印象

您必须在配置中定义朋友和美国人(朋友是美国人)之间的关系。

@Configuration
public class YourAppConfig {

    @Bean
    public Friend defineFriend() {
        return new American();
    }
}

因此,在测试中您可以验证:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourAppTest {

    @Autowired
    private Friend friend;

    @Test
    public void drinkTest() {
        assertEquals(friend.favoriteDrink(), "Coffee");
    }
}

刻板印象

刻板印象告诉 Spring,所有 Friend 都是美国人,直接在 Class 声明上。

@Component
public class American extends Friend {

    @Override
    public String favoriteDrink() {
        return "Coffee";
    }
}

如果您的课程遇到 Friend 课程,它将假定它是美国人。这是朋友和美国人之间的一对一关系。

如果您希望您的班级以这种方式行事,这将非常有用。您不需要在配置文件中定义 Bean。(您甚至不需要配置文件)。Spring 将自动从该 Stereotype 创建一个 Bean。


这就是为什么 Component、Repository、Service 和 Controller 注释属于 Stereotype 包的原因。Spring 不太关心你的类的细节,从 Spring 的角度来看,你的类是Repository,ServiceController,如果它不属于任何一个,那么它就是一个Component.

Spring 只是过度简化了你的类。因此,名称刻板印象。

于 2019-03-24T19:09:25.673 回答