Spring 的几种注入方式
前情提要
@Autowired注解相信大家都不陌生了,在我们使用idea写代码的时候,经常会发现@Autowired注解下面是有小黄线的。
为什么会出现这样的问题呢?
查阅了相关文档了解了一下,原来这个提示是spring framerwork 4.0
以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。
Spring中的三种注入方式
字段注入
在基于属性的依赖注入中,字段/属性被标注为**@Autowired**。一旦类被实例化,Spring容器将设置这些字段。
@Controller
public class UserController {
@Autowired
private UserService userService;
}
正如所看到的,这是依赖注入最干净的方法,因为它避免了添加样板代码,并且不需要声明类的构造函数。代码看起来很干净简洁,但是正如代码检查器已经向我们暗示的那样,这种方法有一些缺点。
构造器注入
在基于构造函数的依赖注入中,类构造函数被标注为**@Autowired**,并包含了许多与要注入的对象相关的参数。
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService){
this.userService = userService;
}
}
然后在spring官方文档中,**@Autowired**注解也是可以省去的。
基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。
Setter 方法注入
在基于setter的依赖注入中,setter方法被标注为**@Autowired**。一旦使用无参数构造函数或无参数静态工厂方法实例化Bean,为了注入Bean的依赖项,Spring容器将调用这些setter方法。
@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
}
为什么字段注入不被推荐
详情可看这篇文章