咱们在使用Spring框架进行开发时,不可避免的要进行依赖注入(Dependency Injection),也就是把实例从Spring容器中取出来进行使用。Spring的依赖注入方式主要有三种,分别为Constructor、Setter和Field。有了选择的余地,使人纠结的地方就来了,这三种方式哪一个更好一些呢?安全
接下来咱们逐一看下这三种注入方式:框架
@Autowired private DependencyA dependencyA;
函数
依赖不能是final的测试
容易出现循环依赖this
private DependencyB dependencyB; @Autowired public void setDependencyB(DependencyB dependencyB) { this.dependencyB = dependencyB; }
private DependencyC dependencyC; @Autowired public DI(DependencyC dependencyC) { this.dependencyC = dependencyC; }
依赖能够是final的spa
高耦合类随着构造参数的增加很容易被识别出来线程
不须要依赖@Autowired注解(当类中只有一个构造方法时,能够省略@Autowired)指针
Spring官方目前推荐的是构造器注入。根据官方的说法,由于它令人们可以将应用程序组件实现为不可变对象,并确保所需的依赖项不为null。此外,注入构造函数的组件老是以彻底初始化的状态返回到客户端(调用)代码。code
不可变对象:说的是能够是字段用final关键字修饰。对象
依赖不为null:由于有了自定义的构造函数,因此程序再也不提供默认的空参构造,类在实例化时必须传入全部须要的参数。
彻底初始化的状态:构造方法的做用就是初始化成员变量,在Java类加载实例化的过程当中,构造方法是最后一步,因此返回来的组件都是初始化以后的状态。
三种方式各有利弊,从靠谱程度来讲,仍是构造器注入更好一些,它能有效避免一些好比循环依赖、空指针等异常的发生。另外,Spring中Bean默认为单例的,有可能会出现线程安全问题,这个时候final就更有必要了。固然,其余两种方式也有其本身的发光点,咱们能够按实际须要选择使用,或混合使用。