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

zfciruhq  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(172)

我有一个简单的构造函数注入示例,但我无法使用:

  1. @Component
  2. public class ScienceFilenameMetadataProcessor extends ScienceBasicFileProcessor implements Processor {
  3. private final FilenameParser parser;
  4. @Autowired
  5. public ScienceFilenameMetadataProcessor(FilenameParser parser) {
  6. this.parser = parser;
  7. }
  8. }

字符串
FilenameParser是一个接口,包含几个实现。使用@标识符标识。
我想从另一个类中使用这个组件:

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


我想把filenameParser传递给构造函数。但是当然我想避免new关键字,否则spring不会正确初始化我的类。但是我想避免在ScienceFilenameMetadataProcessor类中硬编码filenameParser实现。
这怎么可能。
谢谢

uqxowvwt

uqxowvwt1#

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

1.接口In

  1. public interface In {
  2. String getClassName();
  3. }

字符串
这个接口声明了一个方法getClassName()

2.实现类:

a. A类:

  1. public class ClassA implements In {
  2. @Override
  3. public String getClassName() {
  4. return "Class A";
  5. }
  6. }

B. B类:

  1. public class ClassB implements In {
  2. @Override
  3. public String getClassName() {
  4. return "Class B";
  5. }
  6. }


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

3.配置类Config

  1. @Configuration
  2. public class Config {
  3. @Bean
  4. public In classA() {
  5. return new ClassA();
  6. }
  7. @Bean In classB() {
  8. return new ClassB();
  9. }
  10. }


这个配置类定义了名为classAclassB的bean。这些bean将被注入到其他组件中。

4.处理器:

  1. public interface Processor {
  2. public In getIn();
  3. }

a. ProcessorClassA:

  1. @Component
  2. public class ProcessorClassA implements Processor {
  3. private final In in;
  4. public ProcessorClassA(@Qualifier("classA") In in) {
  5. this.in = in;
  6. }
  7. public In getIn() {
  8. return in;
  9. }
  10. }

B.处理器类B:

  1. @Component
  2. public class ProcessorClassB implements Processor{
  3. private final In in;
  4. public ProcessorClassB(@Qualifier("classB") In in) {
  5. this.in = in;
  6. }
  7. public In getIn() {
  8. return in;
  9. }
  10. }

5. RouteBuilder类:

  1. @Component
  2. public class RouteBuilder {
  3. private final Processor processor;
  4. public RouteBuilder(@Qualifier("processorClassA") Processor processor) {
  5. this.processor = processor;
  6. }
  7. public Processor getProcessor() {
  8. return processor;
  9. }
  10. }

6.另一个RouteBuilder类:

  1. @Component
  2. public class AnotherRouteBuilder {
  3. private final Processor processor;
  4. public AnotherRouteBuilder(@Qualifier("processorClassB") Processor processor) {
  5. this.processor = processor;
  6. }
  7. public Processor getProcessor() {
  8. return processor;
  9. }
  10. }

6.验证结果:

  1. String resultA = routeBuilder.getProcessor().getIn().getClassName();
  2. // The value of result will be "Class A"
  3. String resultB = anotherRouteBuilder.getProcessor().getIn().getClassName();
  4. // The value of result will be "Class B"


如果您还有其他问题,请随时询问!

展开查看全部

相关问题