Spring注释@Controller是否与@Service相同?


80

Spring注解@Controller与相同@Service吗?

我知道@Controller哪个可用于URL映射和调用业务逻辑。

@Service用于注释包含业务逻辑的服务类。

我可以用来@Controller代替@ServiceService类吗?

Answers:


123

不,它们彼此非常不同。

两者都是@Component批注的不同专业化(实际上,它们是同一接口的两种不同实现),因此两者都可以通过类路径扫描来发现(如果您在XML配置中声明)

@Service批注用于服务层,并为执行服务任务的类添加批注,通常不使用它,但在许多情况下,您可以使用此批注代表最佳实践。例如,您可以直接调用DAO类以将对象持久保存到数据库中,但这太可怕了。调用一个调用DAO的服务类是非常好的。执行关注点分离模式是一件好事。

@Controller注释是在Spring MVC框架(用于实现Web应用程序的Spring框架的组件)中使用的注释。@Controller注释指示特定的类充当控制器的角色。@Controller注释充当带注释的类的构造型,指示其作用。调度程序扫描此类带注释的类以查找映射的方法,并检测@RequestMapping注释。

因此,查看Spring MVC体系结构,您将拥有一个DispatcherServlet类(在XML配置中声明),该类表示一个前端控制器,该控制器将所有HTTP请求分派到适当的控制器类(由@Controller注释)。此类通过其方法执行业务逻辑(并可以调用服务)。这些类(或其方法)通常也使用@RequestMapping注释进行注释,该注释指定控制器及其方法处理的HTTP请求。

例如:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

此类是控制器。

此类处理所有针对“ / appointments”“文件夹”的HTTP请求,尤其是get方法是调用该方法来处理针对“ / appointments”文件夹的所有GET HTTP请求的方法。

我希望现在对您来说更加清楚。


3
非常好的解释。值得一提的是,(at)控制器类不必具有(at)RequestMapping,(at)RequestMapping也可以是方法级别。
计时器

1
我可以将它们混合在单个类定义中吗?还是将它们实现为单独的类更好?
肯赛

37

如果你看的定义@Controller@Service注释,那么你会发现,这些特殊类型的@Component注释。

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

那有什么区别呢?

@Controller

@Controller注解表明特定类供应控制器的作用。该@Controller注释充当注解类刻板印象,这表明它的作用。

@Controller有什么特别之处?

您不能使用任何其他类似@Service或切换此注释@Repository,即使它们看起来相同。调度程序扫描带有注释的类,@Controller@RequestMapping在其中检测注释。您只能@RequestMapping在带@Controller注释的类上使用。


@服务

@Services 在存储库层中保存业务逻辑和调用方法。

@Service有什么特别之处?

除了用来表明它保持业务逻辑这一事实外,该注释没有提供任何明显的专业知识,但是谁知道,spring将来可能会增加一些额外的例外。

链接的答案:Spring中的@ Component,@ Repository和@Service批注有什么区别?


7

不,@Controller与都不相同@Service,尽管它们都是的专长@Component,因此它们都是通过类路径扫描进行发现的候选对象。该@Service注释在服务层使用,并且@Controller是在表示层Spring MVC控制器。一个@Controller典型的将有一个URL映射,并通过一个Web请求被触发。


5

@Service与@Controller

@Service:类是“业务服务门面”(按核心J2EE模式的意义)或类似的东西。

@Controller:指示带注释的类是“ Controller”(例如,Web控制器)。

----------查找有关主要刻板印象的有用笔记 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@interface组件

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

指示带注释的类是组件。当使用基于注释的配置和类路径扫描时,此类将被视为自动检测的候选。

其他类级别的注释也可以被视为标识组件,通常是一种特殊的组件:例如@Repository注释或AspectJ的@Aspect注释。

@interface控制器

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

指示带注释的类是“控制器”(例如,Web控制器)。

此批注用作@Component的特化,允许通过类路径扫描自动检测实现类。它通常与基于RequestMapping注释的带注释的处理程序方法结合使用。

@接口服务

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

指示带注释的类是“服务”,最初由域驱动设计(Evans,2003)定义为“作为接口提供的操作,在模型中是独立的,没有封装状态”。可能还表明某个类是“业务服务门面”(就核心J2EE模式而言)或类似的东西。此注释是通用的刻板印象,各个团队可以缩小其语义并适当使用。

此批注用作@Component的特化,允许通过类路径扫描自动检测实现类。

@interface资料库

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

指示带注释的类是“存储库”,最初由Domain-Driven Design(Evans,2003)定义为“一种封装存储,检索和搜索行为的机制,该机制模仿对象的集合”。实现诸如“数据访问对象”之类的传统J2EE模式的团队也可以将这种构造型应用于DAO类,尽管在这样做之前应注意理解数据访问对象与DDD样式存储库之间的区别。此注释是通用的刻板印象,各个团队可以缩小其语义并适当使用。

与PersistenceExceptionTranslationPostProcessor结合使用时,这样注释的类可以进行Spring DataAccessException转换。出于工具,方面等目的,还注释了带注释的类在整个应用程序体系结构中的作用。

从Spring 2.5开始,此注释还用作@Component的特殊化,允许通过类路径扫描自动检测实现类。


1

我已经在这里回答了类似的问题,这是链接

两者都没有。

@Service注释具有其他用途,而@Controller具有其他用途。实际上,Spring @ Component,@ Service,@ Repository和@Controller批注用于在Spring框架中使用类路径扫描进行自动bean检测,但这并不意味着所有功能都相同。@Service:表示带注释的类是业务层中的Service组件。

@Controller:带注释的类指示它是控制器组件,并且主要用于表示层。


0

不,你不能他们与众不同。例如,部署应用程序时,您的控制器映射会很闷。

无论如何,为什么您要控制器不是服务,反之亦然。


0

从春季开始

如您所见,该类使用@Controller注释。就其本身而言,@ Controller并不能做很多事情。其主要目的是将此类识别为组件扫描的组件。因为HomeController带有@Controller注释,所以Spring的组件扫描会自动发现它,并在Spring应用程序上下文中将HomeController的实例创建为bean。

实际上,其他一些注解(包括@ Component,@ Service和@Repository)的作用类似于@Controller。您可以使用其他任何注释同样有效地对HomeController进行注释,并且仍然可以使用相同的注释。但是,@ Controller的选择更能说明该组件在应用程序中的角色。


0

您可以将@service声明为@Controller

不能@Controller声明为@Service

@服务

这是正常的。您只是将类声明为组件。

@Controller

它比Component更特殊。该调度程序将搜索@RequestMapping这里。因此,用@Controller注释的类将另外被声明为可调用API的URL。


0
  • 控制器将处理不同视图之间的导航。您的映射请求映射在控制器的帮助下进行处理。
  • 服务直接与通常执行业务逻辑的存储库进行交互。您可以在服务层添加,删除,删除等
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.