当前位置: 首页 > 知识库问答 >
问题:

Spring豆布线

燕正德
2023-03-14
public interface CompactDisc {
    void play()
}
public class HybridTheory implements CompactDisc { }
public class Meteora implements CompactDisc { }
public class myTest {
    @Autowired
    private CompactDisc cd;
}  

共有1个答案

曾枫
2023-03-14

当您遇到有多个实现相同接口的情况时,可以采取的方法很少。

1.使用@Qualifier注释

如果使用类路径扫描,您的类可能如下所示:

@Component
public class HybridTheory implements CompactDisc { }

@Component
public class Meteora implements CompactDisc { }
    null
@Service
class Player {
    private final CompactDisc compactDisc;

    // note that starting from Spring 4.3 
    // you can omit @Autowired annotation from constructor
    Player(@Qualifier("hybridTheory") CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }
}
@Component
@Primary
public class HybridTheory implements CompactDisc { }

每当Spring发现有多个bean匹配注入点时,它就会注入用@primary注释的那个bean。注意,如果在注入点中使用@primary和实现接口注释了多个bean,那么问题仍然存在。

3.使用Java配置

尽管@qualifier和@primary解决了这个问题,但有时您可能会发现,要了解注入了哪个实现,您需要大量遍历源代码。有时更干净的方法是从类中删除@component(或其他构造型注释),并使用Java配置声明bean:

public class HybridTheory implements CompactDisc { }

public class Meteora implements CompactDisc { }

@Configuration
class RecordsConfiguration {

    @Bean
    CompactDisc hybridTheory() {
        return new HybridTheory();
    }

    @Bean
    CompactDisc meteora() {
        return new Meteora();
    }

    @Bean
    Player player() {
        return new Player(meteora());
    }
}
 类似资料:
  • 我对Spring bean扫描有点困惑。 AFAIK我需要把

  • 豆豆Pool — GOLANG简单的工作池 本repo是一个简单的golang工作池,仅供交流和学习使用。golang工作池的作用是可以限制goroutine的启动数量。 use     //NewTask是放到工作池当中运行的函数。使用的时候需要先实例化他 w := pool.NewTask(func() error { fmt.Println(time.Now());return nil })

  • 我还没有找到一个我能理解的spring豆的高级定义。我经常在Grails文档和书籍中看到它们,但我认为理解它们是什么将是有益的。那么什么是spring豆呢?如何才能利用它们呢?它们和依赖注入有关系吗?

  • 我目前对Spring的@Async和单例Bean如何处理并发请求之间的区别感到非常困惑。 我已经阅读了一个非常有见地的解释问题(单例Bean如何服务于并发请求?)。但是我想根据第二个答案进一步扩展。 答案是"简而言之,无状态单例将能够同时服务两个请求,因为它们位于不同的线程中。" 如果这是真的,那么Spring的@Async的意义是什么,Spring的教程(https://spring.io/gu

  • 我在项目中使用了Spring、Cucumber和Junit。测试运行程序带有注释,因此在运行套件之前,它会创建一个Spring上下文。 我希望Spring将步骤定义类实例化为Springbean,这样我就可以注入依赖项并在步骤中使用它们。可以通过将类声明为来完成。 到现在为止,一直都还不错。问题是Cucumber将再次实例化步骤定义,并且不会使用Spring已经创建的bean和注入的依赖项。 有什

  • 我试图在tomcat 9上部署我的应用程序,但在部署过程中,我面临以下异常 依赖关系.gradle 如下所示 注意:相同的应用程序正在weblogic 12上成功运行。