鹤山市住房和城乡建设局网站,上海官网建设费用,地区门户网站 建设攻略,wordpress的安装步骤文章目录Springboot依赖注入Bean的方式一、Field 注入/属性注入二、set注入三、构造器注入Springboot依赖注入Bean的方式
一、Field 注入/属性注入
Autowired注解的一大使用场景就是Field Injection。
Controller
public class UserController {Autowiredprivate UserServic…
文章目录Springboot依赖注入Bean的方式一、Field 注入/属性注入二、set注入三、构造器注入Springboot依赖注入Bean的方式
一、Field 注入/属性注入
Autowired注解的一大使用场景就是Field Injection。
Controller
public class UserController {Autowiredprivate UserService userService;}通过Java的反射机制实现所以private的成员也可以被注入具体的对象
优点
代码少简洁明了。新增依赖十分方便不需要修改原有代码
缺点
容易出现空指针异常。Field 注入允许构建对象实例时依赖的对象为空导致空指针异常不能在启动时就爆出来只能在用到它时才发现。 空指针异常不是必现的与bean的实例化顺序有关。有时把依赖的bean改个名字就会报空指针异常。会出现循环依赖的隐患。
二、set注入
Setter Injection需要依赖Autowired注解使用方式与Field Injection有所不同Field Injection时Autowired是用在成员变量上而Setter Injection的时候Autowired是用在成员变量的Setter函数上。
Controller
public class UserController {private UserService userService;Autowiredpublic void setUserService(UserService userService){this.userService userService;}
}通过调用成员变量的set方法来注入想要使用的依赖对象。
优点
注入参数多的时候比较方便。构造器注入参数太多了显得很笨重能让类在之后重新配置或者重新注入。
缺点
有一定风险。set注入是后初始化其依赖对象如果一个对象在没有完全初始化就被外界使用是不安全的尤其是在多线程场景下更加突出。
三、构造器注入
Constructor Injection是构造器注入是Springboot最为推荐的一种使用方式。
Controller
public class UserController {private final UserService userService;public UserController(UserService userService){this.userService userService;}}注意 不能提供无参构造方法否则Springboot默认会加载无参的构造方法Bean实例对象会为null Springboot官方建议使用final来修饰成员变量然后通过构造方法来进行注入。原因final修饰的成员变量是不能够被修改的不加final虽然也能注入Bean,但是若被其他人修改为null,可能会导致不必要的问题所以最好是加final。
通过对象构建的时候建立关系这种方式对对象创建的顺序会有要求当然Spring会为你搞定这样的先后顺序除非你出现循环依赖然后就会抛出异常。
Spring 4.x 的时候Spring 官方在对比构造器注入和 Setter 注入时推荐使用构造器注入方式
优点
保证注入的组件不可变确保需要的依赖不为空解决循环依赖的问题(若有循环依赖会在项目启动时抛错)
能够保证注入的组件不可变并且确保需要的依赖不为空。此外构造器注入的依赖总是能够在返回客户端组件代码的时候保证完全初始化的状态。
若手工写构造方法觉得麻烦也可以使用lombok中的RequiredArgsConstructor
RequiredArgsConstructor
public class VerifyController {private final UserService userService;private final StudentService studentService;
}RequiredArgsConstructor RequiredArgsConstructor 注解是针对标有 NonNull 注解的变量和 final 变量进行参数的构造方法。
构造器注入的原理可参考《https://blog.csdn.net/sihai12345/article/details/101951348》