这次看一下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)