使用@Component、@Repository、@Service 的托管 bean

使用@Component、@Repository、@Service 的托管 bean

简介

在本教程中,您将学习不同的 Spring 原型注解(@Component、@Repository 和 @Service)来将任何类声明为 Spring 管理的 Bean。Spring MVC 还有其他几个注解,如@Controller 和@RestController。在 Spring 中作为 bean 管理的类称为托管组件。

spring 中基本上很少有将类声明为托管组件的原型注:

1、@Component 注解将任何类声明为托管的 spring bean。

2、@Service 注释将任何服务/业务层类声明为托管组件。

3、同样,@Repository 注释将任何 DTO 或 Repository 类声明为托管 bean。

4在 Spring MVC 中,@Controller 和 @RestController 用于为表示层声明 Controller。

 

为什么使用 Stereotype 注释?

原型注释表示类型或方法在整个架构中的角色(在概念级别,而不是实现级别)。旨在供工具和方面使用(成为切入点的理想目标)。

Stereotype 注解将类与架构预期区分开来,它与内部的实际实现无关。

 

如何使用这些注解?

第一步

使用这些注解的简单方法是首先使用@ComponentScan 注解对@Configuration 类进行注解,并指定类所在的包/基础包。

@Configuration
@ComponentScan("com.jbd.webapp")
public class AppConfig {
  //Extra config goes
}

第二步

下一步是使用相应的注释对类进行注释。

package com.jbd.webapp;
@Repository
public class AppRepository {
  //...
}

 

@Component、@Repository、@Service 的区别?

@Component 注解

我们可以在应用程序中使用@Component 注解将任何类声明为 Spring 的托管组件。Spring 在内部使用 @Component 获取并注册 bean,并且通常不查找 @Service 和 @Repository。因为@Service 和@Repository 也是用@Component 注解的。

简单来说,@ComponentScan 路径下注有@Component 注解的类会在 Spring ApplicationContext 中注册为 Bean。您可以使用 @Inject 或 @Autowired 注释来使用此类 bean 的实例。

@Component
public class PdfReader {
  //class members
}

正如您在下面看到的,@Component 注解接受可选的组件名称作为参数。

@Target(ElementType.TYPE) // Can be used on Class, Interface and Enum
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
  /**
   * The value may indicate a suggestion for a logical component name,
   * to be turned into a Spring bean in case of an autodetected component.
   * @return the suggested component name, if any (or empty String otherwise)
   */
  String value() default "";
}

@Service 注释

任何包含业务逻辑的类都使用@Service 注释进行注释。就像@Component 一样,您只需要使用@Service("optionalName") 使用可选名称来注释类。

@Service("orderService")
public class OrderService {
  //Class details
}

@Service 注释内部如下所示。很明显,这个注解只是@Component 的一个别名。到目前为止,它还没有任何其他特殊功能。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
  /**
   * The value may indicate a suggestion for a logical component name,
   * to be turned into a Spring bean in case of an autodetected component.
   * @return the suggested component name, if any (or empty String otherwise)
   */
  @AliasFor(annotation = Component.class)
  String value() default "";
}

@Repository 注释

任何保存数据库或持久逻辑的类都使用@Repository 进行注释。换句话说,DTO/DAO 使用带有可选名称参数的@Repository 进行注释。

@Repository
public class OrderDaoImpl implements OrderDao {
  //Order manipulation methods.
}

正如你所看到的,这个注解只是@Component 的一个别名。请记住,@Repository 捕获特定于持久性的已检查异常,并将它们作为 Spring 的统一未检查异常之一重新抛出。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
  /**
   * The value may indicate a suggestion for a logical component name,
   * to be turned into a Spring bean in case of an autodetected component.
   * @return the suggested component name, if any (or empty String otherwise)
   */
  @AliasFor(annotation = Component.class)
  String value() default "";
}

总结

希望你学会了在 Spring 中使用 @Component、@Service 和 @Repository 等不同的注解来管理 bean。简而言之,@Component 注解用于将任何通用类声明为 Spring 管理的 bean 类,@Service 用于将任何类声明为业务逻辑(服务)类,@Repository 用于 DTO、DAO 或存储库 执行数据库操作的类。

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0