下你所需,载你所想!
IT技术源码资料下载网站

使用Spring的BeanPostProcessor实现工厂模式

:其他软件 2020-07-07 17:20:43

使用Spring的BeanPostProcessor实现工厂模式

最近学习Sring的源码,发现一个利器BeanPostProcessor。这个后置处理器可以在bean初始化前后对bean进行操作。我们可以在初始化的时候对自己想要的bean进行缓存,进而实现自己需要处理的逻辑。
背景
当我们需要根据类型调用接口不同实现的时候,我们可以使用工厂模式实现。下面说下博主遇到过的两次需要使用工厂的场景。
场景一:
当有一个模块,我们需要根据数据库的类型实现不同的的sql。我们此时需要定义一个接口然后每一种数据库实现不同的sql。在调用时根据当前的数据库类型调用对应的实现类。
场景二:
我们业务需要对接不同的传感器设备,但是总体业务逻辑就是获取数据,发送心跳。每一种设备的数据协议又不一样。所以需要使用工厂,根据不同的设备调用对应的实现类。
工厂模式
静态工厂
**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:54
*@Version
**
@Service
ubcclassHandlerService1{ubc<T>voidhandle(Constant.HandlerTyehandlerTye,TdataDO){
IHandlerhandler=nl;
if(handlerTye.getTye().intValue()==Constant.HandlerTye.HANDLE_TYEP_1.getTye()){
handler=newTye1Handler();
}elseif(handlerTye.getTye().intValue()==Constant.HandlerTye.HANDLE_TYEP_2.getTye()){
handler=newTye2Handler();
}elseif(handlerTye.getTye().intValue()==Constant.HandlerTye.HANDLE_TYEP_3.getTye()){
handler=newTye3Handler();
}elseif(handlerTye.getTye().intValue()==Constant.HandlerTye.HANDLE_TYEP_4.getTye()){
handler=newTye4Handler();
}else{
thrownewRuntimeExcetion("类型错误");
}
handler.handle(dataDO);
}
}动态工厂,通过class实现
**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:54
*@Version
**
@Service
ubcclassHandlerService2{ubc<T,HextendsIHandler>voidhandle(Class<H>clzz,TdataDO)throwsIllegalAccessExcetion,InstantiationExcetion{
IHandlerhandler=clzz.newInstance();
handler.handle(dataDO);
}}进入主题
BeanPostProcessor实现相同接口的不同实现bean的工厂首先定义一个注解,后续用来标示bean的处理类型@Target({ElementTye.TYPE})
@Retention(RetentionPocy.RUNTIME)
@Documented
@Comonent
ubc@interfaceHandler{@AasFor(annotation=Comonent.class)
Stringvalue()defat"";**
*业务处理类型
*@turn
*
Constant.HandlerTyehandlerTye();}
处理类型**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:25
*@Version
**ubcclassConstant{ubcenumHandlerTye{
HANDLE_TYEP_1(1),
HANDLE_TYEP_2(2),
HANDLE_TYEP_3(3),
HANDLE_TYEP_4(4);
rivateIntegertye;HandlerTye(Integertye){
this.tye=tye;
}ubcIntegergetTye(){
turntye;
}}}
定义接口处理**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:29
*@Version
**
ubcinterfaceIHandler<T>{voidhandle(Tdata);}BeanPostProcessor实现对bean后置处理。通过注解的类型缓存bean对象。**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:29
*@Version
**
@Service
ubcclassHandleServiceimlementsBeanPostProcessor{rivateMa<Integer,IHandler>ortDataHandlerMa=newConcurntHashMa<>();ubcObjectostProcessAfterInitiazation(Objectbean,StringbeanName)throwsBeansExcetion{
if(beaninstanceofIHandler){
Handler[]ortHandlers=bean.getClass().getAnnotationsByTye(Handler.class);
if(ortHandlers==nl||ortHandlers.length==0){
turnbean;
}
HandlerortHandler=ortHandlers[0];
ortDataHandlerMa.ut(ortHandler.handlerTye().getTye(),(IHandler)bean);
}
turnbean;
}
ubc<T>voidhandle(Constant.HandlerTyehandlerTye,TdataDO){
IHandlerortDataHandler=ortDataHandlerMa.get(handlerTye.getTye());
if(ortDataHandler==nl){
thrownewRuntimeExcetion("类型错误");
}
ortDataHandler.handle(dataDO);
}}
自定义处理器实现,每一种实现一次。**
*@Descrition
*@AuthorSingh
*@Date2020-07-0621:32
*@Version
**
@Handler(handlerTye=Constant.HandlerTye.HANDLE_TYEP_1)
ubcclassTye1HandlerimlementsIHandler<String>{@Override
ubcvoidhandle(Stringdata){}
}

TAG:

相关阅读

最新推荐