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 作为 beanmanongserviceimpl
实现了 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() { } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论