春豆接线

use*_*427 4 java spring dependency-injection javabeans

我正在学习Spring的基础知识,现在我正在研究Beans /接线。这个问题可能没有道理,这只是我在阅读/尝试了Craig Walls的《 Spring into Action》一书中的一些示例后所正在考虑的问题。说有这个界面。

public interface CompactDisc {
    void play()
}
Run Code Online (Sandbox Code Playgroud)

我有两个实现此接口的类。

public class HybridTheory implements CompactDisc { }
public class Meteora implements CompactDisc { }
Run Code Online (Sandbox Code Playgroud)

我的配置类使用组件扫描,并从这两个类创建bean。现在,如果我有一个具有CD实例并通过autowired进行连接的测试类

public class myTest {
    @Autowired
    private CompactDisc cd;
}  
Run Code Online (Sandbox Code Playgroud)

会有一个正确的问题吗?我的问题是,如何连接它,以便它在一个豆子上使用另一个豆子?还是这不是现实情况/我应该使特定类的属性而不是接口的属性吗?我想我只是难以绕线布线。

Mac*_*iak 5

每当遇到不止一个实现相同接口的情况时,都可以采取几种方法。

1.使用@Qualifier批注

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

@Component
public class HybridTheory implements CompactDisc { }

@Component
public class Meteora implements CompactDisc { }
Run Code Online (Sandbox Code Playgroud)

每个Spring bean都有一个由容器分配的id,默认情况下,它是一个以小写字母开头的类名。对于这两个组件,将是:

  • hybridTheory
  • meteora

您可能还想通过将name参数传递给@Component注释来选择自定义名称,例如:@Component("myFavLinkinParkAlbum")

然后,每当您自动装配CompactDiscbean时,您都可以传递@Qualifier批注,并告诉Spring 您确实要记住哪个bean。

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

2.将您的一种豆标记为 @Primary

如果在大多数注入点中您总是注入相同的bean,而很少使用另一个bean,则可以考虑使用@Primary标记前一个

@Component
@Primary
public class HybridTheory implements CompactDisc { }
Run Code Online (Sandbox Code Playgroud)

每当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());
    }
}
Run Code Online (Sandbox Code Playgroud)

选择最适合您的用例的一种!