我有一个简单的构造函数注入示例,但我无法开始工作:
@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 实现进行硬编码。
这怎么可能。
谢谢
提供的代码定义了一个简单的 Spring 应用程序,其中包含配置类、接口和实现该接口的几个类。然后使用注释将这些类注入到 Spring 组件中。
In
:public interface In {
String getClassName();
}
这个接口声明了一个方法
getClassName()
。
public class ClassA implements In {
@Override
public String getClassName() {
return "Class A";
}
}
public class ClassB implements In {
@Override
public String getClassName() {
return "Class B";
}
}
ClassA
和ClassB
都实现了In
接口并提供了自己的getClassName()
方法的实现。
Config
:@Configuration
public class Config {
@Bean
public In in() {
return new ClassB();
}
}
此配置类定义了一个名为
in()
的 bean,它返回 ClassB
的实例。这个bean将被注入到其他组件中。
@Component
@Getter
public class Processor {
private final In in;
public Processor(In in) {
this.in = in;
}
}
这个 Spring 组件 (
@Component
) 有一个构造函数,它采用 In
类型的对象(由 Spring 注入)并将其分配给 in
字段。 @Getter
注释为 in
字段生成 getter 方法。
@Component
@Getter
public class RouteBuilder {
private final Processor processor;
public RouteBuilder(Processor processor) {
this.processor = processor;
}
}
与
Processor
类类似,该类有一个构造函数,它接受 Processor
类型的对象(由 Spring 注入)并将其分配给 processor
字段。 @Getter
注释为 processor
字段生成 getter 方法。
最后,如果您想使用
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
实例。
如有任何疑问,请随时询问!