@Autowierd 、@Resource
回顾一下Spring 的三种依赖注入
1.属性注入
public class SysUserController extends BaseController { @Autowired private ISysUserService userService; @Resource private ISysRoleService roleService; }
@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。
@Qualifier和Autowired配合使用,指定bean的名称,也可以做到按名称装配。
- IDEA中直接在变量上使用 @Autowired会发现警告提示:
Field injection is not recommended
。- 原因是官方建议我们使用构造器注入方式,这种方式存在明显的弊端,比如:注入对象不能用final修饰、无法发现NullPointException的存在。
2.构造器注入
public class SysUserController extends BaseController { private final ISysUserService userService; private final ISysRoleService roleService; public SysUserController(ISysUserService userService, ISysRoleService roleService) { this.userService = userService; this.roleService = roleService; } }
构造器依赖注入通过容器触发一个类的构造器来实现的,通过强制指明依赖注入来保证这个类的运行,防止
NullPointerException
;Spring官方推荐使用构造器注入不仅是因为这种情况下成员属性可以使用final关键字修饰,更关键的一点是能够避免循环依赖,如果存在循环依赖,Spring项目启动的时候就会报错。
3.Setter注入
public class SysUserController extends BaseController { private ISysUserService userService; @Autowired public void setUserService(ISysUserService userService) { this.userService = userService; } }
需要注意的是,在使用Setter注入时需要加
@Autowired
或@Resource
注解,否则是无法注入成功的.另外要注意一点,属性注入和Setter注入的变量都无法使用
final
关键字修饰。
@RequiredArgsConstructor
在说完Spring的三种依赖注入后,我们来认识一下Lombok的@RequiredArgsConstructor 注解。
@Controller @RequiredArgsConstructor public class SysUserController extends BaseController { private final ISysUserService userService; private ISysRoleService roleService; //---------------------------- }
使用
@RequiredArgsConstructor
会为我们生成一个包含常量、使用final关键字修饰的变量的私有构造方法。
那我们就可以不使用属性注入(@Autowired和@Resource)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。