Skip to content

Nicki518412/design-mode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

有关于优化业务解耦的设计模式

1.枚举抽象(简单业务实现)

业务存在不同枚举值对应不同的赋值操作,可以定义一个赋值操作的顶层接口
Create.java
不同枚举值实现自己的方法
CreateMode.java
将枚举类作为对象封装在传入参数中
CreateInfo.java
定义此类枚举的顶层接口,@JsonValue用于前端入参的序列化
IEnumType.java
请求结构体会通过对应的枚举值调用自己Override的方法
img.png
如果使用mybatis作为jdbc框架,建议配置mybatis的枚举序列化器

2.抽象类多继承(复杂业务实现)

业务存在不同枚举值对应不同的操作,首先定义枚举类
CreateMode.java
定义顶层抽象类,封装公共方法,定义抽象方法,定义抽象类的key
GenericCreate.java
抽象类的多实现
DirectInfo.java
FactoryInfo.java
FunctionalInfo.java
ReflectInfo.java
为什么返回枚举常量
img_1.png
将这些多实现类的对象放入map集合里。 实现InitializingBean, DisposableBean 接口,加载交由springboot接管。 map里存在唯一kv对应(也是通过对应枚举值寻找对应实现类并调用对应方法,参考 HANDLER_COMPONENT_MAP)
Function<T,R> 函数式调用 可以使代码更简略(参考 HANDLER_MAP)
GenericContext.java

3.动态加载(不推荐)

FactoryBean是springboot提供的一个动态实例化bean的一个接口,这是一个对通用接口的代理封装
CurrencyFactoryBean.java
提供注解,用于继承同一接口的多实现类,注意:这些实现类上没有@Component注解
FactoryBeanCreate.java
顶层接口
Info.java
接口类的实现
DirectInfo.java
FactoryInfo.java
FunctionalInfo.java
ReflectInfo.java
工厂模式生产对应的bean
CreateModeFactory.java //通过bean实现,不需要关注接口
CreateModeInterfaceFactory.java //通过接口实现,但是需实现InvocationHandler
InfoInvocationHandler.java //实现InvocationHandler
serviceLoader 是 JAVA的SPI特性,外部加载类模板,通过META-INFO/service下的文件进行配置可进行加载的模板类 org.suki.design.mode.interfaces.Info
调用方式
img.png
通用Bean工厂,需搭配 @FactoryBeanCreate使用
GenericBeanFactory.java

4.ThreadLocal(封装参数,DDD领域驱动)

用于参数在各种上下文之间传递,对于每一层调用进行切面,在切面的时候进行上下文配置并传递(控制层/服务层1/服务层2...)
这里的示例是放在请求的header里的某一个字段在请求体进入的时候set,然后在返回的过程中remove
TextContext.java
TextInterceptor.java
WebConfig.java

About

一些springboot3的高级用法

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published