Java 没有if-else的Spring限定符
我使用Spring框架。我想为创建档案提供服务。我有两种类型的档案。我想知道不使用if-else语句的另一种方法 接口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
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();
}