springboot 注入方式

141 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

👨‍🎓作者:生无clean

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。

☠️每日毒鸡汤:好的容貌和很多钱,是进入上流社交活动的通行证。

SpringBoot中注入依赖的方式有很多种,小编在这里介绍最常见的几种依赖注入方式。废话不多说,直接上干货。

SpringBoot注入依赖

一、Field 注入

  • Field注入是最简单注入的一种方式,直接使用注解即可完成依赖注入,使用非常的方便,代码看起来也更加的整洁。
@Controller
public class InjectDepend {
    @Autowired
    private UserService userService;
    @Resource
    private UserService userService;
}

二、Setter 方法注入

  • 使用Setter方式注入依赖的方式很麻烦,一般不建议使用。
  • 使用 Setter 注入的时候,需要添加@Autowried或者@Resource注解。
@Controller
public class InjectDepend {
    private UserService userService;
    private BetaService betaService;
    
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    @Autowired
    public void setBetaService(BetaService betaService) {
        this.betaService = betaService;
    }
}

三、Constructor 注入(构造器注入)

  • 有利于强制依赖。通过在构造函数中提供依赖,您可以确保依赖对象在被构造时已准备好被使用。在构造函数中赋值的字段也可以是final的,这使得对象是完全不可变的,或者至少可以保护其必需的字段。

  • 构造器注入还可以避免 Field 注入的循环依赖问题,比如 在 Alpha 中注入 Beta,又在 Beta 中注入 Alpha。如果使用构造器注入,在 Spring 启动的时候就会抛出 BeanCurrentlyInCreationException 提醒循环依赖。

  • 使用构造器注入依赖的时候不需要使用 @Autowrite注解或者@Resource注解

@Controller
public class InjectDepend {
    private final UserService userService;
    private final BetaService betaService;
     
    public InjectDepend(UserService userService, BetaService betaService) {
        this.alphaService = alphaService;
        this.betaService = betaService;
    }
}

四、lombok中的@RequiredArgsConstructor

  • 在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱。

lombok提供了一个注解: @RequiredArgsConstructor(onConstructor =@_(@Autowired)) 写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解。

@RequiredArgsConstructor
public class InjectDepend {

    private final UserService userService;
    private final InvitationService invitationService;
}