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 没有if-else的Spring限定符_Java_Spring_If Statement - Fatal编程技术网

Java 没有if-else的Spring限定符

Java 没有if-else的Spring限定符,java,spring,if-statement,Java,Spring,If Statement,我使用Spring框架。我想为创建档案提供服务。我有两种类型的档案。我想知道不使用if-else语句的另一种方法 接口 public interface Archive { public String makeArchive(); } 实施1 @Component public class ArchiveRAR implements Archive { @Override public String makeArchive() { return "I

我使用Spring框架。我想为创建档案提供服务。我有两种类型的档案。我想知道不使用if-else语句的另一种方法

接口

public interface Archive {
     public String makeArchive();
}
实施1

@Component
public class ArchiveRAR implements Archive {
    @Override
    public String makeArchive() {
        return "I made archive RAR.";
   }
}
实施2

@Component
public class ArchiveZIP implements Archive {
    @Override
    public String makeArchive() {
        return "I made archive ZIP.";
    }
}
服务

@Service
public class RunnerApp implements CommandLineRunner {

    @Autowired
    @Qualifier("archiveRAR")
    Archive archiveRAR;

    @Autowired
    @Qualifier("archiveZIP")
    Archive archiveZIP;

    @Override
    public void run(String... strings) throws Exception {

        Report report = new Report("ZIP");
        //HERE
        if ("RAR".equals(report.getType())) {
            System.out.println(archiveRAR.makeArchive());
        } else if ("ZIP".equals(report.getType())) {
            System.out.println(archiveZIP.makeArchive());
        }

   }
}
主应用程序

@SpringBootApplication
public class MainApp {
    public static void main(String[] args) throws Exception {
         SpringApplication.run(MainApp.class, args);
    }
}

谢谢。

如果您可以事先决定要使用哪一个,那么有一种更干净的方法来完成此操作,基本上不需要if-else和字符串比较:在创建报表bean时,只需将适当的存档引用传递给报表bean,并定义一个将生成存档的方法:

@Component
class Report {
     private Archive archive;

     // declare that Archive dependency is required
     @Autowired
     public Report(@Qualifier("archiveRar") Archive archive) {
     // or public Report(@Qualifier("archiveZip") Archive archive) { 
     // depending on which one you would like to inject and use
         this.archive = archive;
     }

     public void generateArchive() {
         archive.makeArchive();
     }
}
还可以使用有意义的限定符名称为2个存档实现添加注释:

@Component
@Qualifier("archiveRar")
public class ArchiveRAR implements Archive {
    @Override
    public String makeArchive() {
        return "I made archive RAR.";
   }
}

该服务现在看起来更简单:

@Service
public class RunnerApp implements CommandLineRunner {

    @Autowired
    private Report report;

    @Override
    public void run(String... strings) throws Exception {
        report.generateArchive();
   }
}
如果需要运行时注入,您可以去掉bean的If-else而不是字符串值限定符,例如通过使用BeanFactory访问SpringBean容器

保留上述代码用于存档及其实现,并删除将不再使用的报表类。在服务中,请使用以下命令:

@Service
public class RunnerApp implements CommandLineRunner {

    @Autowired
    private BeanFactory beanFactory;

    @Override
    public void run(String... strings) throws Exception {
        String qualifierValue = "archiveRar";
        // or String qualifierValue = "archiveZip";
        Archive archive = beanFactory.getBean(qualifierValue, Archive.class);
        System.out.println(archive.makeArchive());
   }
}

我建议您使用此处工厂模式,而不是if-else语句:

@Component
public class ArchiveFactory {
    @Autowired
    private Map<String, Archive> archives;

    public Archive getArhive(String archiveType) {
        return archives.get(archiveType);
    }
}
当然,您还需要定义映射类型的bean。

另一种方法

@Component("RAR")
public class ArchiveRAR implements Archive{...}

@Component("ZIP")
public class ArchiveZIP implements Archive {...}
以及注入BeanFactory的服务类


请看一看关于如何使用限定符的,是否必须创建2个bean并使用@Qualifier注释,因为您可以创建1个bean来处理类型,并且每个bean都可以有特定的行为
@Service
public class RunnerApp implements CommandLineRunner {

    @Autowired
    private ArchiveFactory archiveFactory;

    @Override
    public void run(String... strings) throws Exception {

        Report report = new Report("ZIP");
        Archive archive = archiveFactory.get(report.getType());
        System.out.println(archive.makeArchive());
   }
}
@Component("RAR")
public class ArchiveRAR implements Archive{...}

@Component("ZIP")
public class ArchiveZIP implements Archive {...}
    @Service
    public class RunnerApp implements CommandLineRunner {
       @Autowired 
       BeanFactory beans;

@Override
    public void run(String... strings) throws Exception {
     String archiveType = "ZIP/RAR"; 
     Archive archive = beans.getBean(archiveType,Archive.class);
    archive.makeArchive(); 

}