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)
会有一个正确的问题吗?我的问题是,如何连接它,以便它在一个豆子上使用另一个豆子?还是这不是现实情况/我应该使特定类的属性而不是接口的属性吗?我想我只是难以绕线布线。
每当遇到不止一个实现相同接口的情况时,都可以采取几种方法。
1.使用@Qualifier批注
如果使用类路径扫描,则类可能如下所示:
@Component
public class HybridTheory implements CompactDisc { }
@Component
public class Meteora implements CompactDisc { }
Run Code Online (Sandbox Code Playgroud)
每个Spring bean都有一个由容器分配的id,默认情况下,它是一个以小写字母开头的类名。对于这两个组件,将是:
hybridTheorymeteora您可能还想通过将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)
选择最适合您的用例的一种!
| 归档时间: |
|
| 查看次数: |
7938 次 |
| 最近记录: |