1. 关于项目中使用 @Autowired 注解

刚开始接触 spring boot 的时候看到别人在字段上添加 @Autowired 自己也就跟着这样写了,刚
开始只是注意到字段有下划线,这个如果是 Mapper 的话,在 dto 上添加 @Repository 就可以解決,但是还是可以看到注解报错,鼠标悬浮显示“不推荐这样使用注解“,那么正确的方式是怎样的呢?

有两种方式:

  1. 基于构造函数的依赖注入:对于必须的依赖项,使用构造函数注入,可以使它们成为 final且
    不为null
    。综合来看 Constructor Injection 在很多方面都是优于其他的,所以也是首选,构造器上的@Autowired 是可以不写的

2.基于 setter 的依赖注入:如上图,只是将构造函数改为了 setter 方法。

再说回字段依赖注入的缺点:

  • 对有final 装饰的变量不好使,因为字段赋值是在使用的时候,这个时候类早已经完成了初始化
    而 final 是和类初始化一致进行的。
  • 掩盖单一职责的设计思想 :当依赖注入太多的时候,字段注入更难以发现。
  • 字段依赖注入是使用的 spring 的 1OC, 使得紧密耦合
  • private 的字段隐藏了依赖性
  • 无法对注入的厲性进行安检

对于@Autowired再多说几句,当 Spring 发现@Autowired 注解时,会到上下文去找和其匹配的 Bean,并自动注入到相应的地方去。而@Resource@Autowired的作用几乎一致,所以很多人直接使用前者
主要是前者是 J2EE 的注解,默认按照 byName 方式进行 bean 匹配,不要求依赖对象必须存在;
后者是 Spring 的注解,默认按照 byType 的方式进行 bean 匹配,默认要求依赖对象必须存在,如
果要允许 null值,可以设置@Autowired(required=false)

2. @Service使用

当 Spring 中的Service 有多个实现类,该怎么注入呢:

  1. Controller 中注入 service 的时候使用 @Autowired 自动注入,再使用@Qualifier("beanId") 来指定注入哪一个;
  2. Controller 中注入 service 的时候使用@Resource(type =类名.class)来指定注入哪一
    个;
  3. 每个 service 的 impl 都可以指定名称(使用@service(“名称”)),然后在 Controller 中注
    入 service 的时候使用名称来指定注入哪一个(使用@Resource(name=“名称")

这里的@service 注解其实做了两件事:一是声明实现类是一个 bean,所以其他类可以使用
@Autowired将其作为一个成员变量自动注入;其次是实现类在 bean 中的 id 是实现类首字母小
写,如 TeacherServicelmpl.java 对应的 bean 就是 teacherServicelmpl,且这个名字不能重复。