Spring中@Controller和@Service注释的区别
Spring 注释 是提供有关程序的数据的元数据的一种形式。注释用于提供关于程序的补充信息。它对注释代码的操作没有直接影响。它不会改变已编译程序的操作。
Spring @Controller注释
Spring @Controller注释是 @Component 注释。@Controller注释表示一个特定的类充当 controller . Spring Controller注释通常与基于的注释处理程序方法结合使用 @RequestMapping 注释。它只能应用于类。它用于将一个类标记为web请求处理程序。它主要用于Spring MVC应用程序。这个注释充当被注释类的原型,指出它的角色。dispatcher会扫描这些带注释的类,寻找映射的方法并进行检测 @RequestMapping 注释.
实现:项目
Step 1: 创建一个简单的Spring引导项目
请参考本文在Eclipse IDE中创建和设置Spring引导项目,并创建一个简单的Spring引导项目。
Step 2: 在pomm .xml文件中添加spring-web依赖项。转到项目中的pom.xml文件,并添加以下spring-web依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Step 3: 在你的项目中创建一个包并命名为“controller”。在控制器中,包创建了一个类,并将其命名为 DemoController . 这是我们最后的项目结构。
// Java Program to Illustrate DemoController File
// Importing package in this code module
package com.example.demo.controller;
// Importing required classes
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
// Annotation
@Controller
// Main class
public class DemoController {
@RequestMapping("/hello")
@ResponseBody
// Method
public String helloGFG()
{
return "Hello GeeksForGeeks";
}
}
我们在控制器层中使用了下面的注释。在本例中,URI路径为 /hello.
- @Controller : 这用于指定控制器。
- @RequestMapping : 这用于映射到Spring MVC控制器方法。
- @ResponseBody : 用于将HTTP响应体与返回类型中的域对象绑定。
Step 4: 现在,我们的控制器准备好了。让我们在 DemoApplication.java 文件。不需要更改 DemoApplication.java file.
示例
// Java Program to Illustrate DemoApplication File
// Importing package in this code module
package com.example.demo;
// Importing required classes
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Annotation
@SpringBootApplication
// Main class
public class DemoApplication {
// Main driver method
public static void main(String[] args)
{
SpringApplication.run(DemoApplication.class, args);
}
}
输出:
Tip: 尝试下面媒体中描述的Tomcat URL,它正在运行 http://localhost:8989/hello
Spring @Service 注释
在应用程序中,业务逻辑驻留在服务层中,因此我们使用@Service注释来指示类属于该层。它也是像@Repository注释一样的@Component注释的专门化。@Service注释最重要的一点是,它只能应用于类。它用于将类标记为服务提供者。因此,总的来说@Service注释用于提供一些业务功能的类。当使用基于注释的配置和类路径扫描时,Spring上下文将自动检测这些类
示例: Project
Step 1: 创建一个简单的Spring引导项目。
提示:在继续学习如何在Eclipse IDE中创建和设置Spring Boot Project并创建一个简单的Spring Boot Project之前,请务必参考这篇文章。
Step 2: 在pomm .xml文件中添加spring上下文依赖项。转到项目中的pom.xml文件,并添加以下spring上下文依赖项。
文件: pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.13</version>
</dependency>
Step 3: 在项目中创建一个包,并将其命名为“service”。在服务中,包创建了一个类,并将其命名为 MyServiceClass” .
File: MyServiceClass
// Java Program to Illustrate MyServiceClass
// Importing package module to code module
package com.example.demo.service;
// Importing required classes
import org.springframework.stereotype.Service;
// Annotation
@Service
// Class
public class MyServiceClass {
// Method
// To compute factorial
public int factorial(int n)
{
// Base case
if (n == 0)
return 1;
// Returning factorial of input number
return n * factorial(n - 1);
}
}
代码解释:
从上面的代码中,我们可以很容易地看出这是一个简单的java类,它提供了计算数字阶乘的功能。所以我们可以称它为服务提供商。我们已经用@Service注释了它,这样spring-context就可以自动检测它,并且我们可以从上下文获取它的实例。
Step 4: Spring库测试
现在我们的Spring存储库已经准备好了,让我们进行测试。去 DemoApplication.java 文件并参考下面的代码。
File: DemoApplication.java
// Java Program to Illustrate DemoApplication
// Importing package module to code fragment
package com.example.demo;
// Importing required classes
import com.example.demo.service.MyServiceClass;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
// Annotation
@SpringBootApplication
// Main class
public class DemoApplication {
// Main driver method
public static void main(String[] args)
{
// Creating context of
// AnnotationConfigApplicationContext class
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext();
context.scan("com.example.demo");
context.refresh();
MyServiceClass myServiceClass
= context.getBean(MyServiceClass.class);
// Testing the factorial method
int factorialOf5 = myServiceClass.factorial(5);
System.out.println("Factorial of 5 is: "
+ factorialOf5);
// Closing the spring context
// using close() method
context.close();
}
}
输出:
最后,让我们讨论一下@Controller注释和@Service注释之间的区别。
@ controller注释 | @ service注释 |
---|---|
@Controller注释表示一个特定的类充当控制器的角色。 | @Service注释用于提供某些业务功能的类。 |
@Controller注释是@Component注释的专门化。 | @Service注释也是@Component注释的专门化。 |
它只能应用于类。 | 它只能应用于类。 |
它用于将一个类标记为web请求处理程序。 | 它用于将类标记为服务提供者。 |
它是表示层(spring-MVC)的原型。 | 它是服务层的原型。 |
我们不能将这个注释与@Service或@Repository之类的任何其他注释进行切换。 | 切换是可能的。 |