通过不同的string文本来生成/获取不同的service。
有的时候我们需要通过客户端传入的文本,例如actionCode,来调用不同的service, 在没有使用spring之前,一般是创建一个工厂,然后通过不同的string来创建不同的service。
例如
if(actionCode.equals(A)){ new AServiceImpl(); }else if(actionCode.equals(B)){ new BServiceImpl(); }
注意AServiceImpl和BServiceImpl都实现相同的接口IService。
上面的这种实现,在service中如果依赖其他的servcie时,会比较麻烦,而且如果有新的service需要更改这个factory。不利于扩展。
在使用spring的项目中,对应这种需求,我们有更好的实现方式,方法如下:
1. 在IService 增加一个方法,例如 public boolean support(@Nonnull String actionCode)
2. 每个service实现在这个方法,当actionCode是需要该service处理时,返回true,如:
AServiceImpl的support方法如下:
public boolean support(@Nonnull String actionCode) {
return StringUtils.equals(“delete”, actionCode);
}
3. 在spring注册上面的service
4. 实现factory, 代码如下:
public class IServiceBeanFactory { private static final Logger LOG = LoggerFactory.getLogger(IServiceBeanFactory.class); //默认的service private static final IService DEFAULT_SERVICE = new DefaultServiceImpl(); //缓存service private static final Map<String, IService> SERVICES_CACHE = new ConcurrentHashMap<String, IService>(); @Nonnull public static IService getService(@Nonnull String actionCode){ IService existedHanlder = SERVICES_CACHE.get(actionCode); if(existedHanlder != null){ return existedHanlder; } WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); Collection<IService> handlers = context.getBeansOfType(IService.class).values(); for (Iterator<IService> iterator = handlers.iterator(); iterator.hasNext(); ) { IService bean = iterator.next(); if((!bean.getClass().isAssignableFrom(DefaultServiceImpl.class)) && bean.support(actionCode)){ SERVICES_CACHE.put(actionCode, bean); return bean; } } return DEFAULT_SERVICE; } }
这种实现方式的好处,当有新的service时,只需要实现Iservice接口,然后到spring中注册一下即可。
同时往这些service注入相关的其他servce也更容易(spring中使用ref)。
相关推荐
JAVAspring
Java Spring 是一个广泛使用的开源框架,它为Java开发者提供了一个全面的编程和配置模型,用于构建现代、松散耦合的Java应用程序。Spring框架的核心特性可以支持其他模块,包括数据访问、Web应用、批量处理、缓存、...
标题 "公司代码javaspring" 暗示了这是一个关于Java Spring框架的项目,可能包含了公司的实际业务代码。描述中的“码代码代码对对对”虽然看起来像是重复,但可以理解为强调编码工作的重要性,以及可能涉及到的代码...
"java spring视频8"可能涵盖了Spring框架的某一特定主题或模块,比如Spring Boot、Spring MVC、Spring Data或者Spring Security等。 在Spring框架中,依赖注入是其核心设计原则之一,它允许开发者在运行时通过容器...
**Java Spring 框架简介** Java Spring 是一个开源的轻量级企业级应用程序框架,以其卓越的灵活性和模块化而闻名。它提供了一个全面的编程和配置模型,旨在简化Java开发并促进良好的编程实践。Spring的核心特性包括...
Java Spring框架是一个广泛使用的开源应用程序框架,主要用于简化Java企业级应用的开发。它以其模块化、松耦合的架构而闻名,提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)、数据访问、Web应用支持...
【JAVAspring】Java Spring开发电商完整平台 【实例简介】 Java Spring开发完整电商平台,SpringBoot框架基础打造的完整电商平台 【核心代码】 JavaSpring开发完整电商平台 └── Java Spring带前后端开发完整电商...
java spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取bean...
java Spring视频详解,非常好,自己学习用的,适合初学者
Java Spring 是一个开源框架,主要用于构建企业级的Java应用程序。Spring 框架以其模块化、松耦合和全面的依赖注入机制而闻名,它极大地简化了Java开发,并且为Web应用提供了强大的支持。Spring API 文档是学习和...
【JAVAspring】一个JavaSpring项目,旨在将自己融入JavaSpring就业市场 这个项目是一个JavaSpring项目,旨在将自己融入JavaSpring就业市场,在那里我独立工作…, (ThisprojectisaJavaSpringproject,...
a java spring test in invertion of control a java spring test in invertion of control
基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip ...
java spring 工具类 java spring 工具类java spring 工具类 java spring 工具类java spring 工具类 java spring 工具类java spring 工具类 java spring 工具类java spring 工具类 java spring 工具类
Spring核心机制——依赖注入,Spring与Struts 2整合应用
基于javaspring+mysql的知识分享系统源码+数据库文件(高分项目).zip该项目是个人大作业项目源码,评审分达到95分以上,都经过严格调试,确保可以运行!放心下载使用。 基于javaspring+mysql的知识分享系统源码+...
【JAVAspring】这个项目是一个JAVAspring项目,旨在将自己融入JAVAspring就业市场,在那里我独立工作…, This project is a Java Spring project, with the aim of inserting myself into the Java Spring job ...
Java Spring 是一个广泛使用的开源框架,它为构建企业级Java应用程序提供了全面的解决方案。Spring框架以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极...
“Java Spring学习笔记”是一份宝贵的资源,专门为想要学习和掌握Java Spring框架的开发者而设计。这份学习笔记提供了详细而系统的教程和实践指南,帮助初学者快速入门,并带领已经有一定经验的开发者深入理解和应用...
《Java Spring框架学习指南》是一份详尽的教育资源,旨在帮助开发者从零基础开始逐步掌握Spring框架,并深入理解其核心概念和技术。这份PDF文档全面覆盖了Spring框架的基础知识,包括IoC(Inversion of Control)...