Spring典型注解@Controller、@Service、@Component、@Repository

Java框架

浏览数:166

2019-8-23

AD:资源代下载服务

这次看一下Spring典型的注解,@Controller,@Service,@Component,@Repository。这四个注解在我们开发中非常的常见,用于定义不同类型的beans。

代码

在spring源码包中,这四个注解的定义

// Component注解定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
    String value() default "";

}

// Repository注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    String value() default "";

}

// Service注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    String value() default "";

}

// Controller注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";

}

可以看到,四个注解都可以说成事Component级别的注解,Spring框架自动扫描的注解也是检测是否有Component注解标记。

@Component

这个注解主要用于标记一个类作为spring的组件,spring扫描的时候扫描的是这个注解。
标记@Component的类在spring的beanName中是类首字母小写,其余字母都一样。

因为其它几个常用典型注解也是Component,所以他们与Component有相同的beanName命名方式。

@Repository

这个注解用来标识这个类是用来直接访问数据库的,这个注解还有一个特点是“自动转换(automatic translation)”。就是在标记 @Repositor发生异常的时候,会有一个处理器来处理异常,而不需要手动的再加try-catch块。

为了启用自动转换异常的特性,我们需要声明一个PersistenceExceptionTranslationPostProcessor的bean。

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

或者在XML文件中:

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

@Service

应用的业务逻辑通常在service层实现,因为我们一般使用@Service注解标记这个类属于业务逻辑层。

@Service
public class SyncPreAuthInfoService{
    //....
}

@Controller

这个注解主要告诉Spring这个类作为控制器,可以看做标记为暴露给前端的入口。

@Controller
public class PayRecordsStatisticsController{
    //...
}

最后

项目小的时候对这些注解没有特别的区分,但项目如果变得越来越大,那么就要划分的细致一些有一定的规则才方便大家的维护。有点像衣服,虽然都是衣服,但是有的是要穿出去开party的,有的是穿出去运动的,有的是休闲的。功能一样,但是用途不是很相同。

  • @Component spring基础的注解,被spring管理的组件或bean
  • @Repository 用于持久层,数据库访问层
  • @Service 用于服务层,处理业务逻辑
  • @Controller 用于呈现层,(spring-mvc)

参考

作者:Real_man