Spring @Component
Spring Component 注释用于将某个类表示为 Component。这意味着当使用基于注释的配置和类路径扫描时,Spring 框架将自动检测这些类以进行依赖注入。
Spring 组件
通俗地说,组件负责一些操作。Spring 框架提供了另外三个特定的注释,用于将类标记为组件。
Service
:表示该类提供某些服务。我们的实用类可以标记为服务类。Repository
:此批注表明该类处理 CRUD 操作,通常与处理数据库表的DAO实现一起使用。Controller
:主要用于Web 应用程序或REST Web 服务,以指定该类是前端控制器,负责处理用户请求并返回适当的响应。
注意这四个注解都在包中org.springframework.stereotype
,是 jar 的一部分spring-context
。大多数情况下,我们的组件类会属于这三个专门的注解之一,因此你可能不会@Component
经常使用注解。
Spring 组件示例
让我们创建一个非常简单的 Spring maven 应用程序来展示 Spring Component 注释的使用以及 Spring 如何使用基于注释的配置和类路径扫描自动检测它。创建一个 maven 项目并添加以下 spring 核心依赖项。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
这就是我们获取 Spring 框架核心功能所需的全部内容。让我们创建一个简单的组件类并用@Component
注释标记它。
package com.journaldev.spring;
import org.springframework.stereotype.Component;
@Component
public class MathComponent {
public int add(int x, int y) {
return x + y;
}
}
现在我们可以创建一个基于注释的 spring 上下文并MathComponent
从中获取 bean。
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.journaldev.spring");
context.refresh();
MathComponent ms = context.getBean(MathComponent.class);
int result = ms.add(1, 2);
System.out.println("Addition of 1 and 2 = " + result);
context.close();
}
}
只需将上述类作为普通 Java 应用程序运行,您就会在控制台中看到以下输出。
Jun 05, 2018 12:49:26 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Tue Jun 05 12:49:26 IST 2018]; root of context hierarchy
Addition of 1 and 2 = 3
Jun 05, 2018 12:49:26 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Tue Jun 05 12:49:26 IST 2018]; root of context hierarchy
您是否意识到了 Spring 的强大功能,我们无需执行任何操作即可将组件注入到 Spring 上下文中。下图显示了我们的 Spring Component 示例项目的目录结构。我们还可以指定组件名称,然后使用相同的名称从 Spring 上下文中获取它。
@Component("mc")
public class MathComponent {
}
MathComponent ms = (MathComponent) context.getBean("mc");
虽然我在 MathComponent 中使用了@Component
注解,但它实际上是一个服务类,我们应该使用@Service
注解。结果仍然是一样的。
您可以从我们的GitHub 存储库中检出该项目。
参考:API文档