Spring中的@ Component,@ Repository和@Service注释的区别

转载
原文:https://www.javaroad.cn/articles/1693

官方文档:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-stereotype-annotations

在Spring 2.0及更高版本中,@ Repository注释是任何满足存储库的角色或构造型(也称为数据访问对象或DAO)的类的标记。该标记的用途之一是异常的自动转换。 Spring 2.5引入了更多的构造型注释:@ Component,@ Service和@Controller。 @Component是任何Spring管理组件的通用构造型。 @Repository,@ Service和@Controller是@Component的特化,用于更具体的用例,例如,分别在持久性,服务和表示层中。因此,你可以使用@Component注释组件类,但是通过使用@ Repository,@ Service或@Controller注释它们,你的类更适合通过工具处理或与方面关联。例如,这些刻板印象注释成为切入点的理想目标。因此,如果你选择在服务层使用@Component或@Service,@ Service显然是更好的选择。同样,如上所述,已经支持@Repository作为持久层中自动异常转换的标记。

在这里插入图片描述

下面是网上赞同比较多的解释

@ Component,@ Repository,@ Controller和@Service之间的差异

@Component

这是一个通用的构造型注释,表明该类是一个spring组件。

@Component有什么特别之处
context:component-scan only扫描@Component并且一般不寻找@Controller,@Service和@Repository。扫描它们是因为它们本身用@Component注释。

只需看看@Controller,@Service和@Repository注释定义:

@Component
public @interface Service {.
}
@Component
public @interface Repository {.
}
@Component
public @interface Controller {}

因此,说@Controller,@Service和@Repository是特殊类型的@Componentannotation.context:component-scan并没有错,并将它们的下一个类注册为bean,就好像它们是用@Component注释一样。

它们被扫描,因为它们本身用注释注释为@Component。如果我们定义自己的自定义注释并使用@Component进行注释,那么它也将被扫描 context:component-scan

@Repository

这是为了表明该类定义了一个数据存储库。

@Repository有什么特别之处?

除了指出这是一个基于注释的配置之外,@Repository的工作是捕获平台特定的异常,并将它们重新抛出为Spring的统一未经检查的异常之一。为此,我们提供了3886827546,我们需要在Spring的应用程序上下文中添加如下:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

这个bean后处理器为任何带有@Repository注释的bean添加了一个顾问程序,以便捕获任何特定于平台的异常,然后将其作为Spring未经检查的数据访问异常之一重新抛出。

@Controller

@Controller annotation指示特定类充当控制器的角色。 The@Controllerannotation充当带注释的类的构造型,指示其角色。

@Controller有什么特别之处?

我们无法将此注释与其他任何类似的@Service或@Repository切换,即使它们看起来相同。调度程序扫描用@Controller注释的类,并检测其中的@RequestMapping个注释。我们只能使用@RequestMappingon@Controller注释类。

@Service

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

@Service有什么特别之处?

除了它用于表明它持有业务逻辑这一事实之外,这个注释没有明显的特点,但是谁知道,spring可能在未来增加一些额外的特殊功能。

还有什么?

与上面类似,将来Spring可能会根据它们的分层约定选择为@Service,@Controller和@Repository添加特殊功能。因此,尊重惯例并将其与层一致使用始终是一个好主意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Cloud应用程序查询MySQL数据库,首先需要在应用程序添加MySQL驱动程序依赖项。在pom.xml文件添加以下依赖项: ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` 接下来,您需要在应用程序创建一个数据源,以从MySQL数据库检索数据。您可以在应用程序使用Spring Data JPA或者MyBatis等持久层框架来实现数据源。 在使用Spring Data JPA的情况下,您可以使用@Entity和@Repository注释在应用程序定义实体类和存储库类。以下是一个简单的示例: ``` @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // getters and setters } @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); } ``` 在上面的代码,@Entity注解用于定义一个实体类。该类的@Id注解用于定义实体的主键,@GeneratedValue注解用于指定主键的生成策略。@Repository注解用于定义一个Spring Data JPA存储库类。在存储库类,您可以定义从数据库检索数据的方法。 在使用MyBatis的情况下,您需要在应用程序定义一个Mapper接口,并在应用程序创建一个SqlSessionFactory实例。以下是一个简单的示例: ``` @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE name=#{name}") List<User> findByName(@Param("name") String name); } @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } } ``` 在上面的代码,@Mapper注解用于定义一个Mapper接口。在Mapper接口,您可以使用@Select注解定义从数据库检索数据的SQL查询语句。在MyBatis配置类,您需要创建一个SqlSessionFactory实例,并将其与应用程序的数据源关联起来。 最后,您可以在应用程序使用@Autowired注解将数据源注入到您的服务,并使用存储库类或Mapper接口从数据库检索数据。 示例代码: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByName(String name) { return userRepository.findByName(name); } } @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getUsersByName(String name) { return userMapper.findByName(name); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值