开发者

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

开发者 https://www.devze.com 2024-09-05 10:19 出处:网络 作者: 码农研究僧
目录1. 基本知识1.1 配置类(@Configuration)1.2 实现类(@Service)1.3 依赖注入(Dependency Injection)1.4 组件类(@Component)2. 实战2.1 配置类2.2 实现类2.3 接口类2.4 组件类总结1. 基本知识
目录
  • 1. 基本知识
    • 1.1 配置类(@Configuration)
    • 1.2 实现类(@Service)
    • 1.3 依赖注入(Dependency Injection)
    • 1.4 组件类(@Component)
  • 2. 实战
    • 2.1 配置类
    • 2.2 实现类
    • 2.3 接口类
    • 2.4 组件类
  • 总结

    1. 基本知识

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

    1.1 配置类(@Configuration)

    配置类是 Spring 中用于定义 Bean 的地方

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

    @Configuration
    @ComponentScan(basePackages = "com.example.myapp")
    public class AppConfig {
        @Bean
        public MyService mySerwww.devze.comvice() {
            return new MyServiceImpl();
        }
    }

    基本的参数补充如下:

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

    1.2 实现类(@Service)

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

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

    @Service
    public cl编程ass MyServiceImpl implements MyService {
        private final MyRepository myRepository;
    
        @Autowired
        public MyServiceImpl(MyRepository myRepository) {
            this.myRepository = myReposhttp://www.devze.comitory;
        }
    
        @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只列出代码前半部分,主要是为了更好的说明

    • JmReportConf编程客栈iguration 配置了 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() {
        }
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号