1. 关于项目中使用 @Autowired 注解
刚开始接触 spring boot 的时候看到别人在字段上添加 @Autowired 自己也就跟着这样写了,刚
开始只是注意到字段有下划线,这个如果是 Mapper 的话,在 dto 上添加 @Repository 就可以解決,但是还是可以看到注解报错,鼠标悬浮显示“不推荐这样使用注解“,那么正确的方式是怎样的呢?
有两种方式:
- 基于构造函数的依赖注入:对于必须的依赖项,使用构造函数注入,可以使它们成为 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 有多个实现类,该怎么注入呢:
- Controller 中注入 service 的时候使用
@Autowired自动注入,再使用@Qualifier("beanId")来指定注入哪一个; - Controller 中注入 service 的时候使用
@Resource(type =类名.class)来指定注入哪一
个; - 每个 service 的 impl 都可以指定名称(使用
@service(“名称”)),然后在 Controller 中注
入 service 的时候使用名称来指定注入哪一个(使用@Resource(name=“名称"))
这里的@service 注解其实做了两件事:一是声明实现类是一个 bean,所以其他类可以使用@Autowired将其作为一个成员变量自动注入;其次是实现类在 bean 中的 id 是实现类首字母小
写,如 TeacherServicelmpl.java 对应的 bean 就是 teacherServicelmpl,且这个名字不能重复。
















