Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧接线_Java_Spring_Dependency Injection_Javabeans - Fatal编程技术网

Java 弹簧接线

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

我正在学习Spring的基础知识,现在我正在复习Bean/wiring。这个问题可能没有意义,这只是我在阅读/尝试了克雷格·沃尔斯(Craig Walls)的《春风化雨》一书中的一些例子后思考的问题。假设有这个接口

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());
    }
}
选择一个最适合您的用例