Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 是否可以通过Spring组件扫描来声明复杂的类依赖关系?_Java_Spring_Oop_Spring Annotations_Solid Principles - Fatal编程技术网

Java 是否可以通过Spring组件扫描来声明复杂的类依赖关系?

Java 是否可以通过Spring组件扫描来声明复杂的类依赖关系?,java,spring,oop,spring-annotations,solid-principles,Java,Spring,Oop,Spring Annotations,Solid Principles,以前的问题: 我有这样的对象依赖关系。A->B->C。C有多个实现。因此,A将有多个实例,这样对于C=A实例的每个实现。A的实现只有1个,显然不是单例的。举例来说,C=5 当前解决方案: 我需要一个依赖关系映射来定义5个bean,每种类型都是a。这是使用spring和基于xml的配置完成的。对于A,将有5个bean def,对于每个C实现,将有5个bean def。每个bean def都将自己独特的C实现称为bean 我使用的是solidoop方法,它包括编写更多的类,平均大约50-150行。我

以前的问题:

我有这样的对象依赖关系。A->B->C。C有多个实现。因此,A将有多个实例,这样对于C=A实例的每个实现。A的实现只有1个,显然不是单例的。举例来说,C=5

当前解决方案:

我需要一个依赖关系映射来定义5个bean,每种类型都是a。这是使用spring和基于xml的配置完成的。对于A,将有5个bean def,对于每个C实现,将有5个bean def。每个bean def都将自己独特的C实现称为bean

我使用的是solidoop方法,它包括编写更多的类,平均大约50-150行。我首先使用关注点分离。然后,我使用依赖项反转将这些类关联起来。这将创建一个对象的关系,这当然是一个基于依赖关系的有向无环图

新问题:

我以前在SpringXML配置中映射过所有这些类型的对象依赖关系。结果很好。一个缺点是XML很长,似乎是重复的,而且XML本身在表示这种关系时不太容易阅读


我想只使用配置的注释来探索映射这些对象关系,但我还没有看到任何示例或文档允许我设置依赖关系层次结构。

使用
@Qualifier
注释可以按名称注入bean,因此类似这样的操作是可能的:

@Configuration
public class ClassCConfig {

    @Bean(name = "c1")
    public C createrC1() {
        returns new C();
    }

    @Bean(name = "c2")
    public C createrC2() {
        ...
    }

    @Bean(name = "c3")
    public C createrC3() {
        ...
    }

    ....   
然后将软管注射到不同的情况下:

@Configuration
public class ClassAConfig {

    @Autowired
    @Qualifier("c1")
    private C c1;

    @Autowired
    @Qualifier("c2")
    private C c2;

    ...

    @Bean(name = "a1")
    public A createA1() {
        ...
    }

    @Bean(name = "a2")
   public A createA2() {
       ...
   }

有了它,就可以只使用Java(扫描)配置来连接任何bean树。

您在哪里寻找的配置是下面的吗?我想是的。。。当我有机会尝试时,我一定会更新问题。谢谢@jhaddesdev我已经试过了,但是有一个问题。JavaConfig类中的自动连线bean为空。例如:
c1
是自动连接的。它在
createA1()
中被引用。不幸的是,在运行
@Bean
方法
createA1()
之前,
c1
不是自动连接的。因此,
c1
为空。基本上,我无法将bean自动连接到配置类中。啊,我犯了一个错误。我在配置中为C创建Bean,它是自动连接的。它是自动连线的,但我试图访问它的范围都错了。我现在明白了。