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
相关产品推荐
相关产品推荐

