标签:代码 选择 item require 类加载 null 代码简洁 字段 开发者
我们在使用Spring框架进行开发时,不可避免的要进行依赖注入(Dependency Injection),也就是把实例从Spring容器中取出来进行使用。Spring的依赖注入方式主要有三种,分别为Constructor、Setter和Field。有了选择的余地,令人纠结的地方就来了,这三种方式哪个更好一些呢?
private DependencyA dependencyA; @Autowired public DI(DependencyA dependencyA) { this.dependencyA = dependencyA; }
private DependencyB dependencyB; @Autowired public void setDependencyB(DependencyB dependencyB) { this.dependencyB = dependencyB; }
@Autowired private DependencyC dependencyC;
对比这三种方式,Field注入显得清爽又整洁。写的时候方便快捷,读起来也很赏心悦目,看起来肯定要优先选择使用它啊。然而,这种方式是存在一些缺点的。
public class A { @Autowired private B b; } public class B { @Autowired private C c; } public class C { @Autowired private A a; }
Spring官方目前推荐的是构造器注入。根据官方的说法,因为它使人们能够将应用程序组件实现为不可变对象,并确保所需的依赖项不为null。此外,注入构造函数的组件总是以完全初始化的状态返回到客户端(调用)代码。
不可变对象:说的是可以是字段用final关键字修饰。
依赖不为null:因为有了自定义的构造函数,所以程序不再提供默认的空参构造,类在实例化时必须传入所有需要的参数。
完全初始化的状态:构造方法的作用就是初始化成员变量,在Java类加载实例化的过程中,构造方法是最后一步,所以返回来的组件都是初始化之后的状态。
最简洁
便利会弱化代码结构设计
依赖不能是可变的(无法final)
容易出现循环依赖
需要使用到多个spring或者java注解
依赖可以是final的
三种方式里最容易测试的方式
高耦合类随着构造参数的增长很容易被识别出来
其他开发平台的开发者也很熟悉
不需要依赖@Autowired注解
标签:代码 选择 item require 类加载 null 代码简洁 字段 开发者
原文地址:https://www.cnblogs.com/hanstrovsky/p/11601010.html