spring如何实现一个接口多个实现类的自动分配详解编程语言
2023-06-13 09:11:47 时间
在开发中我们会经常看到,一个接口被多个实现类继承。那么我们实际开发中如何解决,分配路由多个实现类的、
首先说一下用到的技术也很简单。那就是spring的。ApplicationContext类、里面的getBeanofType();
直接代码:
首先定义一个个性接口
/** * 个性化定制服务接口 * @author david 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 = applicationContext.getBeansOfType(CustomPageTemplate.class); templates = beans.values().stream() .sorted((a,b)- a.priority()-b.priority()) .collect(Collectors.toList()); /** * 根据任务情况判断应该选择具体的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 = applicationContext.getBeansOfType(TestService.class); testServiceMap = new HashMap (); map.forEach((key,value) - testServiceMap.put(value.getCode(),value)); public TestService getTestService(TypeEnum typeEnum) { return testServiceMap.get(typeEnum); }
2. 怎么根据外部条件实现获得对应的实现类?
可以在接口中加一个getCode方法,实现类实现这个方法,然后返回一个定义的枚举类型,然后将getBeansOfType获得map进行转换
枚举:
package com.util; public enum TypeEnum { html, template }
@RequestMapping("test") public String test(HttpServletRequest request, HttpServletResponse response){ String type = request.getParameter("type"); testService = getTestService(type); return testService.test(); public TestService getTestService(String type) { TypeEnum typeEnum = null; if(type.equals("1")) typeEnum = TypeEnum.html; if(type.equals("2")) typeEnum = TypeEnum.template; return testServiceFactory.getTestService(typeEnum); }
以上两种模式都可以完成,多个实现类的自动分配。
这是其中一种,还有一种,一个接口,多个实现类。我们可以利用。applicationContext.getBean();这种实现方式。这也是spring获取实现类的方法。
例如:
applicationContext.getBean(task.identifier()+"/Provider", ProviderSao.class);
这样我们也可以根据,实现类上的id或者name名称去找对应的接口实现。,然后用接口返回接收。
17121.html
cjava相关文章
- 简单介绍一下spring bean的生命周期_Spring bean的生命周期
- Spring 全家桶之 Spring Security(一)
- 编写一个spring-boot-starter-fastjson
- Spring读源码系列番外篇09--BeanWrapper的应用
- Spring Cloud Alibaba 实战来了,这才是最新、最正确的使用方式!
- Spring Boot 实现接口幂等性的 4 种方案
- 分布式事务TCC框架-hmily(spring cloud feign)
- spring管理quartz生命周期之`SchedulerFactoryBean`
- 一个依赖搞定 Spring Boot 接口防盗刷
- spring注解有哪些_Spring 注解
- 【06】Spring源码-分析篇-ApplicationContext
- spring boot中shiro使用自定义注解屏蔽接口鉴权
- Spring - DisposableBean扩展接口
- Spring循环依赖-spring源码详解(四)
- Spring监听器-spring源码详解(五)
- 在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT教程
- Spring Cloud Bus的基本概念和用途
- Spring基于XML实现事务管理
- Spring JDK动态代理
- Spring MVC是什么
- Spring Cloud之Ribbon与Nginx区别详解架构师
- Spring错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.B详解编程语言
- spring的AOP(五)—-Spring AOP 编程(AspectJ )详解编程语言
- spring Boot之初体验详解编程语言
- 用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题详解编程语言
- Spring Cloud之Swagger2API接口管理详解编程语言
- Spring Boot(十三):spring boot小技巧详解编程语言
- Spring的cache缓存介绍详解编程语言
- Spring使用AspectJ开发AOP:基于XML和基于Annotation
- Spring事务管理接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus
- Spring MVC使用HandlerExceptionResolver接口异常处理
- spring使用Spring整合Redis和Jedis构建高性能应用(redisjedis与)
- 通过spring用beanshell实现java接口示例