根据不同的接口编码调用对应的实现类
1、枚举类
public enum TestEnums {
C00001("接口A","com.xxx.impl.CodeProcessorImplA"),
C00002("接口B","com.xxx.impl.CodeProcessorImplB");
private final String desc;
private final String className;
TestEnums(String desc, String className) {
this.desc = desc;
this.className = className;
}
public String getDesc() {
return desc;
}
public String getClassName() {
return className;
}
}
2、编码接收层Service
public interface CodeReceiverService {
String process(String code);
}
3、编码接收层Impl
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class CodeReceiverServiceImpl implements CodeReceiverService {
@Autowired
private ServiceFactory serviceFactory;
@Override
public String process(String code) {
TestEnums testEnums = TestEnums.valueOf(code);
CodeProcessorService service = serviceFactory.getService(testEnums);
return service.execute(code);
}
}
4、工厂类方法:获取对应已经初始化的Bean
@Component
public class ServiceFactory {
@Autowired
private ApplicationContext context;
public CodeProcessorService getService(TestEnums code) {
try {
Class<?> aClass = Class.forName(code.getClassName());
//注意:return (CodeProcessorService ) clazz.newInstance();
//使用Class.newInstance()方法生成实例后,其内部的@Autowired注解不会生效,所以注入的值会为null,导致获取不到属性信息,
//@Autowired注解依赖于Spring的IoC容器来解析并注入对应的Bean,而使用Class.newInstance()是直接调用类的无参构造函数来实例化对象,生成实例则绕过了Spring的依赖注入环节,从而不会进行任何初始化操作。
return (CodeProcessorService) context.getBean(aClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
6、逻辑处理层Service
public interface CodeProcessorService {
String execute(String code);
}
6、C00001编码对应实现类A
@Service
public class CodeProcessorImplA implements CodeProcessorService {
@Override
public String execute(String code) {
return "==========CodeProcessorImplA==========";
}
}
7、C00002编码对应实现类B
@Service
public class CodeProcessorImplB implements CodeProcessorService {
@Override
public String execute(String code) {
return "==========CodeProcessorImplB==========";
}
}
测试代码
String C00001= codeReceiverService.process("COO0O1");
System.out.println(C00001);