在 SpringSource 博客条目中,以下句子引用了一个原型。
因为
@Controller
是 Spring 的@Component
Stereotype 注释的特化,所以 Spring 容器将自动检测该类作为容器的组件扫描过程的一部分,创建一个 bean 定义并允许像任何其他 Spring 管理的组件一样依赖注入实例。
刻板印象这个词的用法是指什么?这是一个技术性的 Spring 术语吗?还是刻板印象只是在一般意义上使用?
在 SpringSource 博客条目中,以下句子引用了一个原型。
因为
@Controller
是 Spring 的@Component
Stereotype 注释的特化,所以 Spring 容器将自动检测该类作为容器的组件扫描过程的一部分,创建一个 bean 定义并允许像任何其他 Spring 管理的组件一样依赖注入实例。
刻板印象这个词的用法是指什么?这是一个技术性的 Spring 术语吗?还是刻板印象只是在一般意义上使用?
JavaDoc对此做了一些说明。
表示类型或方法在整个架构中的角色的注释(在概念级别,而不是实现级别)。
Merriam-Webster的名词定义是stereotype
这样说的:
符合固定或一般模式的东西;尤指:群体成员共同持有的一种标准化的心理图景,它代表一种过于简单化的观点、偏见的态度或不加批判的判断
似乎是为了建议正在注释的特定类的角色。这似乎是有道理的,因为通常建议您使用 注释您的 Controller 类,使用 注释@Controller
Service 类@Service
,等等。
除了明显的组件扫描功能之外,Spring 建议它们为您的 AOP 需求做出很好的切入点划分。
这是一个技术性的 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
,Service
和Controller
,如果它不属于任何一个,那么它就是一个Component
.
Spring 只是过度简化了你的类。因此,名称刻板印象。