设计模式:策略模式(根据参数,调用不同的service接口)
1.定义类容器providers,当spring加载时@PostConstruct(类似构造方法),会先执行init() ; 在init()中,反射"cn.jdk18"的所有带自定义注解@ProviderName的java文件,并且遍历的类要满足被DataProvider继承关系,将满足条件的类放到providers容器中
2.前端url 访问 {basePath}/jdbc 或 {basePath}/kylin 即可调用不用的service
ClassByTypeServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @Service public class ClassByTypeServiceImpl implements ClassByTypeService { private Map<String, Class<? extends DataProvider>> providers = Maps.newConcurrentMap(); @SuppressWarnings ( "unchecked" ) @PostConstruct public void init() { Set<Class<?>> setClass = new Reflections( "cn.jdk18" ).getTypesAnnotatedWith(ProviderName. class ); for (Class<?> class1 : setClass) { if (!class1.isAssignableFrom(DataProvider. class )) { System.out.println(class1.getName()); ProviderName providerName = class1.getAnnotation(ProviderName. class ); providers.put(providerName.name(), (Class) class1); } else { System.out.println( "未被继承:" + class1.getName()); } } } public Class<?> getClassByType(String type) { return providers.get(type); } } |
ClassByTypeService
1 2 3 4 5 6 7 8 9 10 11 | public interface ClassByTypeService { Class<?> getClassByType(String type); } ProviderName @Target (ElementType.TYPE) @Retention (RetentionPolicy.RUNTIME) public @interface ProviderName { String name(); } |
JDBCDataProvider
1 2 3 4 | @ProviderName (name = "jdbc" ) public class JDBCDataProvider extends DataProvider{ public void helloWorld(){} } |
KylinDataProvider
1 2 3 4 | @ProviderName (name = "kylin" ) public class KylinDataProvider extends DataProvider{ public void helloWorld(){} } |
UserController
1 2 3 4 | @RequestMapping ( "/getClassByType/{type}" ) public String getClassByType( @PathVariable String type){ return "saySomething:" +classByTypeService.getClassByType(type).getName(); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤