使用自动装配的简单 Spring 构造函数注入

问题描述 投票:0回答:1

我有一个简单的构造函数注入示例,但我无法开始工作:

@Component
public class ScienceFilenameMetadataProcessor extends ScienceBasicFileProcessor implements Processor {


    private final FilenameParser parser;

    @Autowired
    public ScienceFilenameMetadataProcessor(FilenameParser parser) {
        this.parser = parser;
    }
}

FilenameParser
是一个接口,包含多个实现。使用@Qualifier 进行识别。

我想使用另一个类的这个组件:

@Autowired
public SoarScienceCdfFileRouteBuilder(@Qualifier("cdfFileNameParser") FilenameParser filenameParser) {
    this.scienceFilenameMetadataProcessor = new ScienceFilenameMetadataProcessor(filenameParser);
}

我想将 filenameParser 传递给构造函数。但当然我想避免使用 new 关键字,否则 spring 将无法正确初始化我的类。但是我想避免在

ScienceFilenameMetadataProcessor
类中对 filenameParser 实现进行硬编码。

这怎么可能。

谢谢

java spring spring-boot dependency-injection
1个回答
0
投票

提供的代码定义了一个简单的 Spring 应用程序,其中包含配置类、接口和实现该接口的几个类。然后使用注释将这些类注入到 Spring 组件中。

1.接口
In

public interface In {
    String getClassName();
}

这个接口声明了一个方法

getClassName()

2.实现类:

a. A类:

public class ClassA implements In {
    @Override
    public String getClassName() {
        return "Class A";
    }
}

b. B类:

public class ClassB implements In {
    @Override
    public String getClassName() {
        return "Class B";
    }
}

ClassA
ClassB
都实现了
In
接口并提供了自己的
getClassName()
方法的实现。

3.配置类
Config
:

@Configuration
public class Config {

    @Bean
    public In in() {
        return new ClassB();
    }
}

此配置类定义了一个名为

in()
的 bean,它返回
ClassB
的实例。这个bean将被注入到其他组件中。

4.处理器类别:

@Component
@Getter
public class Processor {

    private final In in;

    public Processor(In in) {
        this.in = in;
    }
}

这个 Spring 组件 (

@Component
) 有一个构造函数,它采用
In
类型的对象(由 Spring 注入)并将其分配给
in
字段。
@Getter
注释为
in
字段生成 getter 方法。

5.路线构建器类:

@Component
@Getter
public class RouteBuilder {

    private final Processor processor;

    public RouteBuilder(Processor processor) {
        this.processor = processor;
    }
}

Processor
类类似,该类有一个构造函数,它接受
Processor
类型的对象(由 Spring 注入)并将其分配给
processor
字段。
@Getter
注释为
processor
字段生成 getter 方法。

6.访问结果:

最后,如果您想使用

routeBuilder.getProcessor().getIn().getClassName()
访问结果,它将调用
getClassName()
bean 返回的
ClassB
实例的
in()
方法。

String result = routeBuilder.getProcessor().getIn().getClassName();
// The value of result will be "Class B"

这是因为

in()
类中的
Config
bean 返回一个
ClassB
实例。


如有任何疑问,请随时询问!

© www.soinside.com 2019 - 2024. All rights reserved.