A spring extension
目录结构:
xy-extension
├──xy-extension-samples
使用示例 ├──xy-extension-spring-boot-starter
扩展组件(使用时引入此项即可)
参照alibaba COLA的扩展组件cola-component-extension-starter 并结合项目实际应用, 简化版的扩展组件, 旨在通过统一的扩展形式来支撑业务的变化, 也是策略模式的一种应用, 代码十分简单,供学习记录参考使用。
- 添加依赖,需要自己下载源码手动使用
mvn install
安装到本地maven库
<dependency>
<groupId>com.xyspring.extension</groupId>
<artifactId>xy-extension-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
- 使用
@EnableExtension
开启扩展功能
@SpringBootApplication
//开启扩展功能
@EnableExtension
public class XyExtensionSamplesApplication {
public static void main(String[] args) {
SpringApplication.run(XyExtensionSamplesApplication.class, args);
}
}
- 在需要使用扩展功能的接口服务上添加注解
@Extensible
@Extensible
public interface HelloService {
void sayHello();
String helloReturn(String hello);
}
- 在接口实现的对应bean上添加注解
@Extension
实现一:
@Extension(scenario = "china")
@Service
public class ChineseHelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("我是中文的: 嗨,你好!");
}
@Override
public String helloReturn(String hello) {
return hello + " 返回!";
}
}
实现二:
@Extension(scenario = "us")
@Service
public class EnglishHelloServiceImpl implements HelloService{
@Override
public void sayHello() {
System.out.println("I'm say English: Excuse me?");
}
@Override
public String helloReturn(String hello) {
return hello + " returned";
}
}
- 调用方式
@RestController
public class HelloController {
@Resource
ExtensionExecutor extensionExecutor;
@RequestMapping("/hello-world")
public void hello(@RequestParam String name){
//业务场景
final String scenario = name.length() > 1 ? "china" : "us";
//调用HelloService的sayHello方法
extensionExecutor.executeVoid(HelloService.class, scenario, HelloService::sayHello);
}
}
在Spring启动时,通过后置处理器保存了一个bean的mapping, 通过 业务场景+接口 来定位使用对应的bean.