25

我正在使用 spring-mvc 开发一个 Web 应用程序。

现在可以使用@Controller、@Service 和@Repository 构造型。

我发现 @Controller 特别有用,特别是因为我正在使用

<context:component-scan base-package="my.cool.controller"/>

现在,关于@Service 和@Repository,到目前为止看起来像

  1. 如果使用正确的构造型注释类,则可以更好地处理异常,好的,这是我承认的优势
  2. 我可以对服务和 DAO/存储库使用组件扫描,但是我不喜欢使用组件扫描的想法,因为它会减慢应用程序的启动时间,这对我来说是一个关键功能(即使它只是1 秒,我每周重新部署一次)

那么,除了更好的例外,还有其他优势吗?注释类对性能有影响吗?

4

2 回答 2

56

刻板印象的解释:

  • @Service- 使用@Service 注释所有服务类。该层知道工作单元。您所有的业务逻辑都将在服务类中。通常,服务层的方法都包含在事务中。您可以从服务方法进行多次 DAO 调用,如果一个事务失败,所有事务都应该回滚。
  • @Repository- 使用 @Repository 注释所有 DAO 类。您所有的数据库访问逻辑都应该在 DAO 类中。
  • @Component- 使用组件构造型注释您的其他组件(例如 REST 资源类)。
  • @Autowired - Let Spring auto-wire other beans into your classes using @Autowired annotation.

@Component is a generic stereotype for any Spring-managed component. @Repository, @Service, and @Controller are specializations of @Component for more specific use cases, for example, in the persistence, service, and presentation layers, respectively.

Reasons to use them :

  • The main advantage of using @Repository or @Service over @Component is that it's easy to write an AOP pointcut that targets, for instance, all classes annotated with @Repository.
  • You don't have to write bean definitions in context xml file. Instead annotate classes and use those by autowiring.
  • Specialized annotations help to clearly demarcate application layers (in a standard 3 tiers application).

Now, Practically performance impact of using context xml beans & annotations is the same. Component scanning is a bit more expensive (when you scan for @Service, @Component). The annotations are 'parsed' with reflection, the xml - with an xml parser. But, as you said, it is startup-time - it happens only once. And on a moderate machine it starts pretty quickly even with annotations.

于 2013-04-19T12:54:15.587 回答
2

组件扫描使您免于通过 xml 或 java 配置手动定义每个 bean。

有多种立体类型来定义服务层、数据层等层。同样基于不同的立体类型,如果你想做一些特定的事情,那么你可以这样做。

于 2013-04-17T05:50:56.493 回答