Java 弹簧接线
我正在学习Spring的基础知识,现在我正在复习Bean/wiring。这个问题可能没有意义,这只是我在阅读/尝试了克雷格·沃尔斯(Craig Walls)的《春风化雨》一书中的一些例子后思考的问题。假设有这个接口Java 弹簧接线,java,spring,dependency-injection,javabeans,Java,Spring,Dependency Injection,Javabeans,我正在学习Spring的基础知识,现在我正在复习Bean/wiring。这个问题可能没有意义,这只是我在阅读/尝试了克雷格·沃尔斯(Craig Walls)的《春风化雨》一书中的一些例子后思考的问题。假设有这个接口 public interface CompactDisc { void play() } public class HybridTheory implements CompactDisc { } public class Meteora implements Compact
public interface CompactDisc {
void play()
}
public class HybridTheory implements CompactDisc { }
public class Meteora implements CompactDisc { }
我有两个类实现这个接口
public interface CompactDisc {
void play()
}
public class HybridTheory implements CompactDisc { }
public class Meteora implements CompactDisc { }
我的配置类使用组件扫描并从这两个类创建bean。现在,如果我有一个测试类,它有一个CD实例,并且使用autowired连接
public class myTest {
@Autowired
private CompactDisc cd;
}
会有问题,对吗?我的问题是,如何连接它,使它使用一个bean覆盖另一个bean?或者这不是真实的情况/我应该将属性设置为特定类而不是接口的属性吗?我想我只是在布线上有点困难。一个简单而优雅的方法是尽可能使用byType。当这是不可能时,可以使用别名方法 使用这种方法的一种方法是手动命名bean,这样在更改类名后,bean的名称就不会有所不同。注意,只有当您有多个相同类型的实现时,才应该使用命名bean,否则实际上不需要命名。在下面的示例中,命名是注释的一部分,例如
@组件(“hybridTheory”)
。这意味着您可以将HybridTheory
的类名更改为您想要的任何名称,而bean名称仍然是HybridTheory
当按名称注入某个对象时,可以使用@Qualifier
注释指定所需的命名bean。我个人更喜欢它而不是@Resource
,因为您可以在构造函数中使用@Qualifier
(我更喜欢构造函数注入而不是基于setter和字段的注入)
您应该而不是注入具体类型-这就是依赖注入的全部内容。其他人(如Spring)将为您处理对象创建;)
Spring文档描述了各种选项。当您遇到多个实现相同接口的情况时,您可以采取的方法很少 1。使用注释 如果使用类路径扫描,则类可能如下所示:
@Component
public class HybridTheory implements CompactDisc { }
@Component
public class Meteora implements CompactDisc { }
每个Springbean都获得一个容器分配的id,默认情况下,它的类名以小写字母开头。对于这两个部件,应为:
杂交理论
meteora
name
参数来选择自定义名称,例如:@Component(“myFavLinkinParkAlbum”)
然后,每当您自动连线CompactDisc
bean时,您都可以传递注释并告诉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;
}
}
2。将一个bean标记为@Primary
如果在大多数注射点注射相同的豆子,而另一个很少使用,你可以考虑用前者标记。 每当Spring发现有多个bean与注入点匹配时,它就会注入带注释的bean。注意,如果在注入点中使用了多个带注释和实现接口的bean,那么问题仍然存在
3。使用 尽管有时您可能会发现,要了解注入了哪种实现,您需要大量阅读源代码。有时更干净的方法是从类中删除(或其他原型注释),并使用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());
}
}
选择一个最适合您的用例