Spring依赖注入推荐使用@Requiredargsconstructor


Spring官方推荐使用构造函数注入,不仅因为这种情况下可以用final关键字修改成员属性,更重要的是可以避免循环依赖。如果存在循环依赖,Spring项目启动时会报错。

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;
    }
}


属性注入装配

public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;

    @Resource
    private ISysRoleService roleService;
}


@Autowired默认按类型装配,而@Resource默认按名称装配。当没有找到与名字匹配的bean时,它将被按类型装配。

而@Qualifier和@Autowired一起用来指定Bean的名字,它也可以通过名字来组装。

在IDEA中直接在变量上使用@Autowired会发现一个警告提示。不建议进行字段注入。

原因是官方建议我们使用构造函数注入的方法,这种方法有明显的缺点,比如:注入对象不能用final来修改,而且不能发现NullPointException的存在。

Setter注入装配

public class SysUserController extends BaseController {
    
    private ISysUserService userService;

    @Autowired
    public void setUserService(ISysUserService userService) {
        this.userService = userService;
    }
}

需要注意的是,在使用Setter注入时,需要添加@Autowired或@Resource注解,否则注入不能成功。

此外,需要注意的是,无论是属性注入还是Setter注入的变量都不能用final关键字来修改。

@RequiredArgsConstructor
不要使用@Autowired, @Resource ,推荐使用@Requiredargsconstructor

在谈完Spring的三个依赖注入后,让我们了解一下Lombok的@RequiredArgsConstructor注解。

在Lombok中,有三个注解用于生成构造方法,即@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor。我们在这里只介绍@RequiredArgsConstructor。

@Controller
@RequiredArgsConstructor
public class SysUserController extends BaseController {

    private final ISysUserService userService;

    private ISysRoleService roleService;

   //----------------------------
}

使用@RequiredArgsConstructor将为我们生成一个私有的构造函数,其中包含用final关键字装饰的常量和变量。

然后我们就可以直接通过构造函数完成注入,而不需要使用属性注入(@Autowired和@Resource),这不仅节省和简化了大量的代码,而且还解决了属性注入可能出现的空指针问题。