@Repository、@Service、@Compent、@Controller与@Mapper、@MapperScan解释与区别
一、@Repository、@Service、@Compent、@Controller区别
@Repository、@Service、@Compent、@Controller这四个注解标签都是Spring注解,都是使其对象被Spring管理,严格来说他们是有区别的:
-
@Repository一般作用于持久层,也是Spring引入第一个管理Bean的注解标签,有助于持久化异常抛出与管理;现在好多开发都是面向接口编程,在持久层都是默认实现,也无法在xml中配置持久层配置被实例化的细节,现在好多项目中持久层只有@Mapper注解,则没有@Repsoitory。
-
@Service主要作用于业务层,对于事务有着特殊的支持,比如事务回滚,在其他标签正常是做不到的啊。
-
@Controller在控制层,针对请求与数据返回有很好的之支持。
-
@Compent标记当前对象被Spring管理,标记为Spring一个组件,一般用在通用配置上或者工具类加载,没有特殊意义。
二、只见@Mapper不见@Repository
现在好多项目中只见@Mapper注解却不见@Repsitory注解,为什么也是可以实现自动注入?是因为我们在mybatis的xml文件配置了上图这个bean,它会去将dao这个层中的mapper(也就是我们的接口)都生成实现类,然后交给spring管理(因为mybatis.xml文件我们最终还是导入了spring容器中),所以我们这里不对这些接口用@repository注解,也是一样可以用它的实现类,(这也是我们写项目时,有时感觉完全是没用到@repository注解的原因,因为没有什么必要)而idea报红线警告,可能是idea自己的原因,这个在我们对它对应的接口用@repository注解后,红线警告会消失,运行也完全没问题,但是这是不规范的。
三、@Mapper与@MapperScan
- @Mapper指明当前接口是允许MyBatis扫描的接口,指明时只需加在持久化接口上就可以。
- @MapperScan开启路径识别,标记当前路径下接口文件默认为MyBatis接口文件。
- 两者的作用是一样的,一个是指定当前接口,一个是指定路径,如果接口文件是集中 @MapperScan只需要指定一次。