如何注入一个继承自另一个在 Spring 中实现的接口的接口

Posted

技术标签:

【中文标题】如何注入一个继承自另一个在 Spring 中实现的接口的接口【英文标题】:How to inject an interface that inherits from another interface that has an implementation in Spring 【发布时间】:2022-01-15 17:19:40 【问题描述】:

我的应用程序的基础设施包中有一个接口和实现。 在域层中,我想使用从基础设施接口继承的另一个接口来访问这个接口。但是Spring无法识别该接口对应的bean

基础设施包


    interface PushNotificationService 
       fun push(): Mono<Void>
    
    
    @Service
    class PushNotificationServiceImpl() : PushNotificationService 
        override fun send(): Mono<Void> 
            //Call grpc to push notification
        
    

域名包


    //import PushNotificationService from the infrastructure package
    
    interface PushNotificationService: PushNotificationService
    
    @Service
    class MessengerServiceImpl(
        @Autowired val pushNotificationService: PushNotificationService //I want to use the interface defined in my domain layer
    )

有什么办法可以做这样的事情吗?

【问题讨论】:

不,你不能,因为你的 PushNotificationService 没有实现! 您应该将接口移动到域模块,因为域不应该依赖于基础设施。 【参考方案1】:

您可以配置注解@ComponentScan,使其从特定基础设施包中排除bean,并考虑您的域包中的bean。

这样的东西对你有用

@ComponentScan(basePackages =  "com.example.my.domain.package" ,
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.my.infrastructure.package.*"))
public class Application  ...

正如 Simon Martinelli 在 cmets 中指出的那样,我希望您在您的域包中为该接口提供一个实现,否则这根本没有意义。

【讨论】:

以上是关于如何注入一个继承自另一个在 Spring 中实现的接口的接口的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 5 中创建一个继承自另一个类的 UIImageView 类

如何制作一个继承自另一个 UITableViewCell 的 UITableViewCell?

如何判断一个 Swift 类是继承自另一个类还是符合协议?

在 Spring Boot 中,如何干掉 if else!

fseek() 是如何在文件系统中实现的?

隐写术是如何在php中实现的