当前位置: 首页 > article >正文

Java中的依赖注入(可以不使用@Autowired注解)

一、@Autowired

@Autowired 是 Spring 框架中一个非常重要的注解,用于实现依赖注入(Dependency Injection, DI)。它可以让 Spring 容器自动将符合条件的 Bean 注入到标注了该注解的字段、构造函数或方法中,从而简化了代码的编写,提高了代码的可读性和可维护性。

基本用法

字段注入
@Component
public class SomeService {

    @Autowired
    private SomeDependency dependency;

    public void doSomething() {
        dependency.doSomething();
    }
}
构造函数注入
@Component
public class SomeService {

    private final SomeDependency dependency;

    @Autowired
    public SomeService(SomeDependency dependency) {
        this.dependency = dependency;
    }

    public void doSomething() {
        dependency.doSomething();
    }
}
方法注入
@Component
public class SomeService {

    private SomeDependency dependency;

    @Autowired
    public void setDependency(SomeDependency dependency) {
        this.dependency = dependency;
    }

    public void doSomething() {
        dependency.doSomething();
    }
}

特点

  • 自动装配:Spring 容器会自动查找符合条件的 Bean 并注入。

  • 可选性:可以通过 @Autowired(required = false) 来指定该依赖是否必须存在。

  • 类型匹配:Spring 会根据类型来匹配 Bean,如果存在多个符合条件的 Bean,可以通过 @Qualifier 注解来指定具体的 Bean。

注意事项

  • 字段注入:虽然字段注入使用起来非常方便,但它有一个缺点是破坏了类的封装性,因为字段被直接暴露给了 Spring 容器。因此,字段注入通常不推荐在复杂的项目中使用。

  • 构造函数注入:构造函数注入可以确保依赖在对象创建时就被注入,从而保证对象的完整性和不可变性。构造函数注入是推荐的依赖注入方式,尤其是在需要保证依赖不可变的情况下。

  • 方法注入:方法注入通常用于设置一些可选的依赖,或者在某些情况下需要对依赖进行一些额外的处理。

二、(不用@Autowired)使用final和@RequiredArgsConstructor

一般使用

可以看到@Autowired下面有波浪线,说明这不是推荐的依赖注入方法

正确做法:

使用lombok注解@RequiredArgsConstructor

三、@Resource

@Resource 是 Java 提供的一个注解,用于实现依赖注入。它与 Spring 的 @Autowired 注解类似,但有一些细微的差别。@Resource 注解是 Java EE 的一部分,而 @Autowired 是 Spring 框架提供的注解。

基本用法

字段注入
@Component
public class SomeService {

    @Resource
    private SomeDependency dependency;

    public void doSomething() {
        dependency.doSomething();
    }
}
方法注入
@Component
public class SomeService {

    private SomeDependency dependency;

    @Resource
    public void setDependency(SomeDependency dependency) {
        this.dependency = dependency;
    }

    public void doSomething() {
        dependency.doSomething();
    }
}

特点

  • 自动装配:Spring 容器会自动查找符合条件的 Bean 并注入。

  • 可选性:可以通过 @Resource(name = "beanName") 来指定具体的 Bean 名称。

  • 类型匹配:Spring 会根据类型来匹配 Bean,如果存在多个符合条件的 Bean,可以通过 @Resource(name = "beanName") 来指定具体的 Bean。

注意事项

  • 字段注入:虽然字段注入使用起来非常方便,但它有一个缺点是破坏了类的封装性,因为字段被直接暴露给了 Spring 容器。因此,字段注入通常不推荐在复杂的项目中使用。

  • 方法注入:方法注入通常用于设置一些可选的依赖,或者在某些情况下需要对依赖进行一些额外的处理。

四、对比 @Autowired 和 @Resource

  • 注入方式

    • @Autowired:默认按类型注入,如果存在多个符合条件的 Bean,可以通过 @Qualifier 注解来指定具体的 Bean。

    • @Resource:默认按名称注入,如果未指定名称,则按类型注入。

  • 使用场景

    • @Autowired:是 Spring 框架提供的注解,适用于 Spring 项目。

    • @Resource:是 Java EE 提供的注解,适用于 Java EE 项目,也可以在 Spring 项目中使用。

  • 推荐使用

    • 在纯 Spring 项目中,推荐使用 @Autowired,因为它与 Spring 框架的集成更加紧密。

    • 在需要与 Java EE 项目集成的场景中,可以使用 @Resource

总结

@Resource@Autowired 都是用于依赖注入的注解,但它们有一些细微的差别。在纯 Spring 项目中,推荐使用 @Autowired,因为它与 Spring 框架的集成更加紧密。在需要与 Java EE 项目集成的场景中,可以使用 @Resource


http://www.kler.cn/a/521114.html

相关文章:

  • 基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)
  • 「蓝桥杯题解」蜗牛(Java)
  • SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)
  • 2. Java-MarkDown文件解析-工具类
  • 使用EVE-NG-锐捷实现OSPF
  • Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类
  • 蓝桥杯之c++入门(一)【数据类型】
  • 信息系统管理工程师第6-8章精讲视频及配套千题通关双双发布,附第14章思维导图
  • 哈希表的使用
  • 使用PyTorch实现逻辑回归:从训练到模型保存与加载
  • MySQL 8 不开通 CLONE 插件,建立主从关系
  • mybatis(78/134)
  • 使用QSqlQueryModel创建交替背景色的表格模型
  • 技术速递|.NET 9 中的 OpenAPI 文档生成
  • 【大数据】数据治理浅析
  • 想品客老师的第七天:闭包和作用域
  • 代码随想录算法训练营day30(补0123)
  • 基于 Ansible 的 Linux 服务器自动化运维实战
  • Java Web-Cookie与Session
  • 前端性能优化指标 - DCL(触发时机、脚本对 DCL 的影响、CSS 对 DCL 的影响)
  • RAG:实现基于本地知识库结合大模型生成(LangChain4j快速入门#1)
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
  • ollama使用详解
  • JavaScript 的 Promise 对象和 Promise.all 方法的使用
  • 验证二叉搜索树(力扣98)
  • Pandas基础03(数据的合并操作/concat()/append()/merge())