@Controller、@Service、@Repository等放在接口还是实现类上

这里以@Service为例,其他也一样

@Service注解是标注在实现类上的 因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。

IOC的思想:A不直接调用B,而是通过调用生产B的工厂(工厂模式),由B工厂来创建B

有三种普通注入方式,分为构造函数的注入、属性注入、接口注入。 将注入方式交给第三方,通过bean的注解,想调用时直接通过注解注入。

所以通过注解注入bean,就是实例化依赖类的方式, 这也是为什么要将@Service和@Repository放到实现类上面而不是接口类上面, 接口只是一个规范,需要各种实现类去实现这个接口,我们要用的就是这些实用类的方法。

如果采用@Autowired来注解,则同样无需指定name属性,若是实现该接口有多个类,则需要通过@Qualifier来做区分(这里之前疑惑了一下,因为在上一层都是针对接口做的操作。另外有一点就是,因为@Service是标注在实现类上的,所以动态代理为cglib,这个debug一下就看到了)


但Mybatis和MapStruct都有个叫@Mapper的注解,这个是放在接口上的,这个属于其他情况,可忽略。

Leave a Reply

Your email address will not be published. Required fields are marked *

lWoHvYe 无悔,专一