wordpress 网站备案,手机清理优化软件排名,六安网事,投资公司是做什么的文章目录 1. 引言2. 不推荐使用Autowired的原因3. Spring提供了三种主要的依赖注入方式3.1. 构造函数注入#xff08;Constructor Injection#xff09;3.2. Setter方法注入#xff08;Setter Injection#xff09;3.3. 字段注入#xff08;Field Injection#xff09; 4… 文章目录 1. 引言2. 不推荐使用Autowired的原因3. Spring提供了三种主要的依赖注入方式3.1. 构造函数注入Constructor Injection3.2. Setter方法注入Setter Injection3.3. 字段注入Field Injection 4. 推荐方案5. 参考博客 1. 引言 Field injection is not recommended意思就是不推荐使用字段注入的方式不是不推荐Autowired注解以前为了简便就直接使用 Resource代替程序员都在不断追求完美。。。 接下来我们实实在在的分析一下为啥不推荐以及到底推荐那种方式注入。
2. 不推荐使用Autowired的原因
不推荐使用Autowired进行字段注入的原因有以下几点 紧耦合性Tight Coupling字段注入将依赖关系直接注入到类的字段上导致类与依赖之间产生紧密的耦合。这使得代码难以修改和扩展并且增加了对具体实现的依赖性。 隐藏依赖关系Hidden Dependencies字段注入隐藏了类的依赖关系使代码不够透明和可读。读取代码时无法立即知道类所依赖的其他组件或服务。 单元测试困难Difficult Unit Testing由于字段注入需要依赖容器来自动注入依赖项导致在编写单元测试时必须依赖完整的容器环境。这增加了测试的复杂性并且可能会导致测试变慢或不稳定。 难以发现依赖问题Dependency Issues字段注入使得依赖可以在运行时更改这增加了代码维护的复杂性。同时如果依赖项没有正确配置或不存在就会在运行时出现错误而不是在编译时就能发现。
相比之下构造器注入Constructor Injection或Setter方法注入Setter Injection提供了更好的可测试性、可维护性和代码清晰度。它们明确列出了类所需的依赖项并使得依赖关系更加透明和易于理解。这些方法也更容易进行单元测试且不需要依赖完整的容器环境。
3. Spring提供了三种主要的依赖注入方式
3.1. 构造函数注入Constructor Injection
通过构造函数将依赖项传递给目标类。这种方式明确声明了类所需的依赖项并且使得类的实例在创建时就具备了必要的依赖关系。示例代码如下
Component
public class SLFBClient {private final DataSourceFactory dataSourceFactory;/*** Autowired 从spring4.3开始可以省略*/
// Autowiredpublic SLFBClient(DataSourceFactory dataSourceFactory) {this.dataSourceFactory dataSourceFactory;}}3.2. Setter方法注入Setter Injection
通过Setter方法设置依赖项。这种方式允许使用默认构造函数创建类的实例然后通过Setter方法来动态设置依赖项。示例代码如下
Component
public class SLFBClient {private DataSourceFactory dataSourceFactory;/*** Autowired 从spring4.3开始可以省略*/
// Autowiredpublic void setDataSourceFactory(DataSourceFactory dataSourceFactory) {this.dataSourceFactory dataSourceFactory;}
}3.3. 字段注入Field Injection
通过直接将依赖项注入到类的字段上。这种方式最简洁但也最不推荐使用在之前的回答中已经详细解释了原因。示例代码如下
Component
public class SLFBClient {// Autowired
// ResourceInjectprivate DataSourceFactory dataSourceFactory;}Autowired、Resource和Inject是用于依赖注入的常见注解它们在使用方式和一些细节上有一些区别。 Autowired 来自Spring框架。默认按照类型byType进行依赖注入会尝试将匹配的bean自动注入到目标字段、构造函数或方法参数中。可以与Qualifier一起使用通过指定bean的名称或限定符来进一步指定要注入的bean。Autowired是非强制性的可以在某些情况下将依赖项标记为可选。 Resource 是Java EE的标准注解也可以被Spring框架支持。默认按照名称byName进行依赖注入通过指定bean的名称来解析并注入匹配的bean。可以使用name属性指定要注入的bean的名称。Resource是强制性的要求找到匹配的bean进行注入否则会抛出异常。 Inject 是Java CDIContexts and Dependency Injection规范的一部分可以由Java EE和一些其他框架如Spring支持。默认按照类型byType进行依赖注入使用与Autowired类似的机制。不支持required属性即所有注入都被视为必需的。可以与Qualifier一起使用通过指定bean的名称或限定符来进一步指定要注入的bean。
总结
Autowired是Spring特有的注解默认按类型进行依赖注入。Resource是Java EE的标准注解可被Spring支持默认按名称进行依赖注入。Inject是Java CDI规范的注解也可被Spring等框架支持默认按类型进行依赖注入。三个注解都可以与Qualifier一起使用来指定具体要注入的bean。Autowired和Inject在功能上相似而Resource功能稍有不同但它们通常可以互相替代使用。
需要注意的是具体在Spring中使用哪个注解可以根据项目的需求、框架的支持以及个人偏好来决定。
4. 推荐方案
使用构造器注入的好处
保证依赖不可变final关键字保证依赖不为空省去了我们对其检查保证返回客户端调用的代码的时候是完全初始化的状态避免了循环依赖提升了代码的可复用性
推荐使用Lombok中的RequiredArgsConstructor注解
Component
RequiredArgsConstructor
public class SLFBClient {private final DataSourceFactory dataSourceFactory;}接下来我们探讨一下Lombok的NoArgsConstructor, RequiredArgsConstructor, AllArgsContructor三个注解
NoArgsConstructor 自动生成一个无参构造函数。适用于不需要传入参数的情况。
import lombok.NoArgsConstructor;NoArgsConstructor
public class MyClass {// Fields and methods
}2. RequiredArgsConstructor
自动生成一个包含所有被标记为final和NonNull的字段的构造函数。适用于只关注部分字段并确保这些字段非空的情况。
import lombok.NonNull;
import lombok.RequiredArgsConstructor;RequiredArgsConstructor
public class MyClass {private final String name;NonNullprivate final Integer age;// Other fields and methods
}AllArgsConstructor 自动生成一个包含所有类字段的构造函数。适用于需要一次性传递所有字段值的情况。
import lombok.AllArgsConstructor;AllArgsConstructor
public class MyClass {private String name;private int age;// Other fields and methods
}5. 参考博客
Field Dependency Injection Considered Harmful
Field injection is not recommendedSpring团队不推荐使用Field注入
【Spring】浅谈spring为什么推荐使用构造器注入