当前位置: 代码网 > it编程>编程语言>Java > 解读Spring配置与服务组件的关系和注入机制

解读Spring配置与服务组件的关系和注入机制

2024年09月04日 Java 我要评论
1. 基本知识使用 spring 框架进行开发时,理解配置类与服务组件之间的关系,以及如何通过依赖注入将它们串联起来,是非常重要的1.1 配置类(@configuration)配置类是 spring

1. 基本知识

使用 spring 框架进行开发时,理解配置类与服务组件之间的关系,以及如何通过依赖注入将它们串联起来,是非常重要的

1.1 配置类(@configuration)

配置类是 spring 中用于定义 bean 的地方

通常使用 @configuration 注解标记,表示这是一个配置类,spring 将会扫描这些类并注册其定义的 bean

@configuration
@componentscan(basepackages = "com.example.myapp")
public class appconfig {
    @bean
    public myservice myservice() {
        return new myserviceimpl();
    }
}

基本的参数补充如下:

  • 定义 bean:通过 @bean 注解的方法可以返回一个 bean 对象,spring 容器将会管理这个 bean 的生命周期
  • 包扫描:使用 @componentscan 注解可以指定扫描的包,自动发现并注册 spring 组件(例如 @component, @service, @repository 等)

1.2 实现类(@service)

通常使用 @service 注解标记,表示这是一个业务服务组件

通常实现一个接口,并在其内部封装了具体的业务逻辑

@service
public class myserviceimpl implements myservice {
    private final myrepository myrepository;

    @autowired
    public myserviceimpl(myrepository myrepository) {
        this.myrepository = myrepository;
    }

    @override
    public void performservice() {
        // 业务逻辑实现
    }
}

主要的功能如下:

  • 业务逻辑实现:服务类实现具体的业务逻辑
  • 依赖注入:服务类通常会通过构造函数或字段注入所需的依赖(例如其他服务、配置属性等)

1.3 依赖注入(dependency injection)

允许将依赖对象(即其他 bean)注入到目标 bean 中,减少了对象间的耦合度

主要的方式有如下:

  • 构造函数注入:通过构造函数将依赖注入到 bean 中
  • 这种方式通常是推荐的,因为它可以确保依赖在 bean 创建时就被提供
@service
public class myservice {
    private final anotherservice anotherservice;

    @autowired
    public myservice(anotherservice anotherservice) {
        this.anotherservice = anotherservice;
    }
}
  • 字段注入:通过直接将依赖注入到字段中
  • 这种方式相对简单,但不如构造函数注入显式
@service
public class myservice {
    @autowired
    private anotherservice anotherservice;
}
  • 方法注入:通过特定的方法注入依赖,通常用于处理需要在运行时决定的依赖
@service
public class myservice {
    private anotherservice anotherservice;

    @autowired
    public void setanotherservice(anotherservice anotherservice) {
        this.anotherservice = anotherservice;
    }
}

1.4 组件类(@component)

可以被自动发现和注册为 spring 管理的 bean

@component
public class mycomponent {
    // 组件逻辑
}

用于标记一个普通的组件类,可以是任意的类,不特定于服务、仓库等特定角色

2. 实战

为更好展示实战项目中的运用,结合上述的知识点给予案例

以下的demo只列出代码前半部分,主要是为了更好的说明

  • jmreportconfiguration 配置了 manongserviceimpl 作为 bean
  • manongserviceimpl 实现了 manongservicei 接口
  • manongclient 依赖于 manongservicei,并通过 spring 注入使用它

2.1 配置类

  • 通过 @componentscan 注解扫描指定的包,自动发现和注册 spring 组件
  • 使用 @bean 注解定义一个名为 manongservice 的 bean,类型为 manongservicei
  • 此方法会创建 manongserviceimpl 的实例,并将其作为 spring 容器中的 bean
@configuration(proxybeanmethods = false)
@componentscan(basepackages = "org.jeecg.modules.jmreport") // 扫描积木报表的包
public class jmreportconfiguration {
    @bean
    public manongservicei manongservice(a a, b b) {
        return new manongserviceimpl(a, b);
    }
}

2.2 实现类

使用 @requiredargsconstructor 注解自动生成一个包含所有 final 字段的构造函数,

补充阅读:详细分析java中@requiredargsconstructor注解的基本知识(附demo)

@requiredargsconstructor
public class manongserviceimpl implements manongservicei {
    private final a a;
    private final b b;
}

2.3 接口类

这是一个接口,定义了服务的合同

public interface manongservicei {

}

2.4 组件类

负责与 manongservicei 进行交互

默认构造函数,通过 spring 的 @autowired 注解注入依赖

@component("manongclient")
public class manongclient {

    @autowired(required = false)
    private manongservicei jimutokenservice;

    @autowired(required = false)
    private jmreportbaseconfig jmbaseconfig;

    public manongclient() {
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com