spring如何实现⼀个接⼝多个实现类的⾃动分配 在开发中我们会经常看到,⼀个接⼝被多个实现类继承。那么我们实际开发中如何解决,分配路由多个实现类的、
⾸先说⼀下⽤到的技术也很简单。那就是spring的。ApplicationContext类、⾥⾯的getBeanofType();
直接代码:
⾸先定义⼀个个性接⼝
/**
* 个性化定制服务接⼝
* @author david
*
enum怎么用*/
public interface CustomPageTemplate extends PageTemplate {
/**
* 服务实现的优先级,数字越⼩越优先
*/
public int priority();
/**
* 服务实现能够处理的任务
*/
public boolean accept(CrawlTask task);
}
public interface PageTemplate {
/**
* 根据任务数据获取展⽰层模型
*/
Page getPageModel(CrawlTask task);
}
然后我们定义⼀个路由类,由这个类。选择不同的实现
@Component
public class PageTemplateRouter {
@Autowired
private ApplicationContext applicationContext;
private List<CustomPageTemplate> templates;
public PageTemplateRouter() {
// TODO Auto-generated constructor stub
}
@PostConstruct
public void init(){
Map<String, CustomPageTemplate> beans = BeansOfType(CustomPageTemplate.class);
templates = beans.values().stream()
.sorted((a,b)->a.priority()-b.priority())
.List());
}
/**
* 根据任务情况判断应该选择具体的PageTemplate实现类
* @param task
* @return
*/
public PageTemplate getPageTemplate(CrawlTask task){
return templates.stream().filter(t->t.accept(task)).findFirst().get();
}
}
简单明了,⼀下,实现。但是这个可不是⾃动识别,下⾯我们就写⼀个,⾃动识别的
1.如何获取应⽤上下⽂对象,applicationcontext
任何类,实现 applicationContextAware接⼝,实现setApplicationContext⽅法,就会在启动时,向实现类的实现⽅法注⼊applicationcontext 对象
@Component
public class TestServiceFactory implements ApplicationContextAware {
private static Map<TypeEnum, TestService> testServiceMap;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String,TestService> map = BeansOfType(TestService.class);
testServiceMap = new HashMap<>();
map.forEach((key,value) -> testServiceMap.Code(),value));
}
public TestService getTestService(TypeEnum typeEnum) {
(typeEnum);
}
}
2. 怎么根据外部条件实现获得对应的实现类?
可以在接⼝中加⼀个getCode⽅法,实现类实现这个⽅法,然后返回⼀个定义的枚举类型,然后将getBeansOfType获得map进⾏转换
枚举:
package com.util;
public enum TypeEnum {
html,
template
}
接⼝:
package com.service;
import com.util.TypeEnum;
import org.springframework.stereotype.Service;
@Service
public interface TestService {
public TypeEnum getCode();
public String test();
}
定义实现类:
@Service
public class TestServiceHtml implements TestService {
@Override
public TypeEnum getCode() {
return TypeEnum.html;
}
@Override
public String test() {
String();
}
}
@Service
public class TestServiceTemplate implements TestService {
@Override
public TypeEnum getCode() {
plate;
}
@Override
public String test() {
String();
}
}
controller类:
@Controller
@RequestMapping("test")
public class TestController {
@Autowired
TestServiceFactory testServiceFactory;
private TestService testService;
@ResponseBody
@RequestMapping("test")
public String test(HttpServletRequest request, HttpServletResponse response){
String type = Parameter("type");
testService = getTestService(type);
st();
}
public TestService getTestService(String type) {
TypeEnum typeEnum = null;
if(type.equals("1")) typeEnum = TypeEnum.html;
if(type.equals("2")) typeEnum = plate;
TestService(typeEnum);
}
}
以上两种模式都可以完成,多个实现类的⾃动分配。
这是其中⼀种,还有⼀种,⼀个接⼝,多个实现类。我们可以利⽤。Bean();这种实现⽅式。这也是spring获取实现类的⽅法。
例如:
这样我们也可以根据,实现类上的id或者name名称去对应的接⼝实现。,然后⽤接⼝返回接收。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论