You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot:无注解声明Service及实现依赖注入方法咨询

不使用@Service和@Autowired实现Spring服务配置与依赖注入

1. 改造查询类

移除原类中的@Service和@Autowired注解,保留构造函数形式的依赖声明(Spring会通过配置类的Bean定义自动完成参数注入):

package fr.rtransat.tvtracker.model.application.query.actor

import fr.rtransat.tvtracker.domain.actor.ActorRepository
import fr.rtransat.tvtracker.domain.actor.exceptions.ActorNotFoundException

class GetActorByUuidQuery(
    private val actorRepository: ActorRepository
) {
    fun handle(request: GetActorByUuidRequest): GetActorByUuidResponse {
        val actor = actorRepository.findByUuid(request.uuid)

        if (actor === null) {
            throw ActorNotFoundException(request.uuid)
        }

        return GetActorByUuidResponse(actor)
    }
}

2. 创建应用层配置类

在应用层新建配置类,用@Configuration标记,通过@Bean注解手动声明GetActorByUuidQuery的Bean实例,并在方法参数中传入依赖的ActorRepository:

package fr.rtransat.tvtracker.model.application.config

import fr.rtransat.tvtracker.domain.actor.ActorRepository
import fr.rtransat.tvtracker.model.application.query.actor.GetActorByUuidQuery
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class ApplicationQueryConfig {

    @Bean
    fun getActorByUuidQuery(actorRepository: ActorRepository): GetActorByUuidQuery {
        return GetActorByUuidQuery(actorRepository)
    }
}

核心说明

  • 领域层的ActorRepository只要已被Spring容器管理(比如通过@Repository注解或同样在配置类中声明Bean),就能直接作为配置类Bean方法的参数,Spring会自动完成依赖注入。
  • 所有服务的注册逻辑集中在应用层配置类中,领域层完全脱离Spring注解,实现了领域层与应用层的清晰分离。

内容的提问来源于stack exchange,提问作者Rtransat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:12:40