当前位置: 首页 > news >正文

阜宁网站制作服务关键词优化简易

阜宁网站制作服务,关键词优化简易,网站直播间怎么做,wordpress有点尴尬目录 1.扩展点使用实例 2.主要技术点 2.1 注解加持 2.2 注解解析 2.3 扩展点路由 在实际项目中,我们经常使用策略模式、或者状态模式来隔离同一接口下不同的实现逻辑,进而消除代码中ifelse硬编码分支,使代码结构更清晰,也大大…

目录

1.扩展点使用实例

2.主要技术点

2.1 注解加持

2.2 注解解析

2.3 扩展点路由


在实际项目中,我们经常使用策略模式、或者状态模式来隔离同一接口下不同的实现逻辑,进而消除代码中ifelse硬编码分支,使代码结构更清晰,也大大提升了代码可读性;同时也满足了“开闭原则”,具备更高的可扩展性;

在cola架构中,给出了一种“扩展点”的思路,本质还是策略模式的实现方式,通过“扩展点注解”的组装方式将策略模式实现类注册到容器中,供后续场景逻辑决策使用;

1.扩展点使用实例

首先通过实例了解下,cola 扩展点的使用方式:

1.首先定义一个SomeExtPt接口,并实现ExtensionPointI接口

public interface SomeExtPt extends ExtensionPointI {public void doSomeThing();
}

2.具体实现SomeExtPt接口,这里给出了2个实现类,如下:

@Extension(bizId = "A")
@Component
public class SomeExtensionA implements SomeExtPt {@Overridepublic void doSomeThing() {System.out.println("SomeExtensionA::doSomething");}}
@Extension(bizId = "B")
@Component
public class SomeExtensionB implements SomeExtPt {@Overridepublic void doSomeThing() {System.out.println("SomeExtensionB::doSomething");}}

3.测试方法:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class ExtensionRegisterTest {@Resourceprivate ExtensionRegister register;@Resourceprivate ExtensionExecutor executor;@Testpublic void test() {SomeExtPt extA = new SomeExtensionA();register.doRegistration(extA);SomeExtPt extB = CglibProxyFactory.createProxy(new SomeExtensionB());register.doRegistration(extB);executor.executeVoid(SomeExtPt.class, BizScenario.valueOf("A"), SomeExtPt::doSomeThing);executor.executeVoid(SomeExtPt.class, BizScenario.valueOf("B"), SomeExtPt::doSomeThing);}}
public class CglibProxyFactory {public static <T> T createProxy(T object) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(object.getClass());enhancer.setCallback(new ProxyCallback(object));return (T) enhancer.create();}public static class ProxyCallback implements MethodInterceptor {private Object target;public ProxyCallback(Object target) {this.target = target;}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("ProxyObject::before");Object object = proxy.invoke(target, args);System.out.println("ProxyObject::after");return object;}}
}

2.主要技术点

2.1 注解加持

上述具体策略接口实现方法标注了扩展点注解:@Extension

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Repeatable(Extensions.class)
@Component
public @interface Extension {String bizId()  default BizScenario.DEFAULT_BIZ_ID;String useCase() default BizScenario.DEFAULT_USE_CASE;String scenario() default BizScenario.DEFAULT_SCENARIO;
}

所有的具体实现方法都需要标注该注解,表明该类属于一个扩展点;同时,由于标注了@Component注解,表明每一个扩展点也是一个bean实例;

2.2 注解解析

扩展点注解的解析工作主要借助类ExtensionBootstrap和ExtensionRegister完成:

@Component
public class ExtensionBootstrap implements ApplicationContextAware {@Resourceprivate ExtensionRegister extensionRegister;private ApplicationContext applicationContext;@PostConstructpublic void init(){Map<String, Object> extensionBeans = applicationContext.getBeansWithAnnotation(Extension.class);extensionBeans.values().forEach(extension -> extensionRegister.doRegistration((ExtensionPointI) extension));// handle @Extensions annotationMap<String, Object> extensionsBeans = applicationContext.getBeansWithAnnotation(Extensions.class);extensionsBeans.values().forEach( extension -> extensionRegister.doRegistrationExtensions((ExtensionPointI) extension));}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}
@Component
public class ExtensionRegister {/*** 扩展点接口名称不合法*/private static final String EXTENSION_INTERFACE_NAME_ILLEGAL = "extension_interface_name_illegal";/*** 扩展点不合法*/private static final String EXTENSION_ILLEGAL = "extension_illegal";/*** 扩展点定义重复*/private static final String EXTENSION_DEFINE_DUPLICATE = "extension_define_duplicate";@Resourceprivate ExtensionRepository extensionRepository;public final static String EXTENSION_EXTPT_NAMING = "ExtPt";public void doRegistration(ExtensionPointI extensionObject) {Class<?> extensionClz = extensionObject.getClass();if (AopUtils.isAopProxy(extensionObject)) {extensionClz = ClassUtils.getUserClass(extensionObject);}Extension extensionAnn = AnnotationUtils.findAnnotation(extensionClz, Extension.class);BizScenario bizScenario = BizScenario.valueOf(extensionAnn.bizId(), extensionAnn.useCase(), extensionAnn.scenario());ExtensionCoordinate extensionCoordinate = new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal = extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal != null) {String errMessage = "Duplicate registration is not allowed for :" + extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}public void doRegistrationExtensions(ExtensionPointI extensionObject){Class<?> extensionClz = extensionObject.getClass();if (AopUtils.isAopProxy(extensionObject)) {extensionClz = ClassUtils.getUserClass(extensionObject);}Extensions extensionsAnnotation = AnnotationUtils.findAnnotation(extensionClz, Extensions.class);Extension[] extensions = extensionsAnnotation.value();if (!ObjectUtils.isEmpty(extensions)){for (Extension extensionAnn : extensions) {BizScenario bizScenario = BizScenario.valueOf(extensionAnn.bizId(), extensionAnn.useCase(), extensionAnn.scenario());ExtensionCoordinate extensionCoordinate = new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal = extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal != null) {String errMessage = "Duplicate registration is not allowed for :" + extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}}//String[] bizIds = extensionsAnnotation.bizId();String[] useCases = extensionsAnnotation.useCase();String[] scenarios = extensionsAnnotation.scenario();for (String bizId : bizIds) {for (String useCase : useCases) {for (String scenario : scenarios) {BizScenario bizScenario = BizScenario.valueOf(bizId, useCase, scenario);ExtensionCoordinate extensionCoordinate = new ExtensionCoordinate(calculateExtensionPoint(extensionClz), bizScenario.getUniqueIdentity());ExtensionPointI preVal = extensionRepository.getExtensionRepo().put(extensionCoordinate, extensionObject);if (preVal != null) {String errMessage = "Duplicate registration is not allowed for :" + extensionCoordinate;throw new ExtensionException(EXTENSION_DEFINE_DUPLICATE, errMessage);}}}}}/*** @param targetClz* @return*/private String calculateExtensionPoint(Class<?> targetClz) {Class<?>[] interfaces = ClassUtils.getAllInterfacesForClass(targetClz);if (interfaces == null || interfaces.length == 0) {throw new ExtensionException(EXTENSION_ILLEGAL, "Please assign a extension point interface for " + targetClz);}for (Class intf : interfaces) {String extensionPoint = intf.getSimpleName();if (extensionPoint.contains(EXTENSION_EXTPT_NAMING)) {return intf.getName();}}String errMessage = "Your name of ExtensionPoint for " + targetClz +" is not valid, must be end of " + EXTENSION_EXTPT_NAMING;throw new ExtensionException(EXTENSION_INTERFACE_NAME_ILLEGAL, errMessage);}}

最终将扩展点和决策条件的映射关系存储到ExtensionRepository中:

@Component
public class ExtensionRepository {public Map<ExtensionCoordinate, ExtensionPointI> getExtensionRepo() {return extensionRepo;}private Map<ExtensionCoordinate, ExtensionPointI> extensionRepo = new HashMap<>();}

2.3 扩展点路由

在实际业务场景调度过程中,会调用ExtensionExecutor的方法locateExtension完成扩展点的查找,最终执行扩展点逻辑;

@Component
public class ExtensionExecutor extends AbstractComponentExecutor {private static final String EXTENSION_NOT_FOUND = "extension_not_found";private Logger logger = LoggerFactory.getLogger(ExtensionExecutor.class);@Resourceprivate ExtensionRepository extensionRepository;@Overrideprotected <C> C locateComponent(Class<C> targetClz, BizScenario bizScenario) {C extension = locateExtension(targetClz, bizScenario);logger.debug("[Located Extension]: " + extension.getClass().getSimpleName());return extension;}/*** if the bizScenarioUniqueIdentity is "ali.tmall.supermarket"* <p>* the search path is as below:* 1、first try to get extension by "ali.tmall.supermarket", if get, return it.* 2、loop try to get extension by "ali.tmall", if get, return it.* 3、loop try to get extension by "ali", if get, return it.* 4、if not found, try the default extension** @param targetClz*/protected <Ext> Ext locateExtension(Class<Ext> targetClz, BizScenario bizScenario) {checkNull(bizScenario);Ext extension;logger.debug("BizScenario in locateExtension is : " + bizScenario.getUniqueIdentity());// first try with full namespaceextension = firstTry(targetClz, bizScenario);if (extension != null) {return extension;}// second try with default scenarioextension = secondTry(targetClz, bizScenario);if (extension != null) {return extension;}// third try with default use case + default scenarioextension = defaultUseCaseTry(targetClz, bizScenario);if (extension != null) {return extension;}String errMessage = "Can not find extension with ExtensionPoint: " +targetClz + " BizScenario:" + bizScenario.getUniqueIdentity();throw new ExtensionException(EXTENSION_NOT_FOUND, errMessage);}/*** first try with full namespace* <p>* example:  biz1.useCase1.scenario1*/private <Ext> Ext firstTry(Class<Ext> targetClz, BizScenario bizScenario) {logger.debug("First trying with " + bizScenario.getUniqueIdentity());return locate(targetClz.getName(), bizScenario.getUniqueIdentity());}/*** second try with default scenario* <p>* example:  biz1.useCase1.#defaultScenario#*/private <Ext> Ext secondTry(Class<Ext> targetClz, BizScenario bizScenario) {logger.debug("Second trying with " + bizScenario.getIdentityWithDefaultScenario());return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultScenario());}/*** third try with default use case + default scenario* <p>* example:  biz1.#defaultUseCase#.#defaultScenario#*/private <Ext> Ext defaultUseCaseTry(Class<Ext> targetClz, BizScenario bizScenario) {logger.debug("Third trying with " + bizScenario.getIdentityWithDefaultUseCase());return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultUseCase());}private <Ext> Ext locate(String name, String uniqueIdentity) {final Ext ext = (Ext) extensionRepository.getExtensionRepo().get(new ExtensionCoordinate(name, uniqueIdentity));return ext;}private void checkNull(BizScenario bizScenario) {if (bizScenario == null) {throw new IllegalArgumentException("BizScenario can not be null for extension");}}}


文章转载自:
http://wanjiakamila.sqLh.cn
http://wanjiaceremonial.sqLh.cn
http://wanjiaagroboy.sqLh.cn
http://wanjiatightrope.sqLh.cn
http://wanjiapiecewise.sqLh.cn
http://wanjianoncommitment.sqLh.cn
http://wanjialakeland.sqLh.cn
http://wanjiaquixotic.sqLh.cn
http://wanjiatam.sqLh.cn
http://wanjialodge.sqLh.cn
http://wanjiahylotheism.sqLh.cn
http://wanjiadolefulness.sqLh.cn
http://wanjiarsv.sqLh.cn
http://wanjiadeknight.sqLh.cn
http://wanjiadenotatum.sqLh.cn
http://wanjiakarl.sqLh.cn
http://wanjiasocket.sqLh.cn
http://wanjiasubinfeud.sqLh.cn
http://wanjiaparacentesis.sqLh.cn
http://wanjiaferricyanogen.sqLh.cn
http://wanjiaferula.sqLh.cn
http://wanjiafiberboard.sqLh.cn
http://wanjiatransworld.sqLh.cn
http://wanjiacaiquejee.sqLh.cn
http://wanjiacheiloplasty.sqLh.cn
http://wanjiaformulae.sqLh.cn
http://wanjiarelieving.sqLh.cn
http://wanjialobulate.sqLh.cn
http://wanjiahomotypic.sqLh.cn
http://wanjiaquidnunc.sqLh.cn
http://wanjiaprowess.sqLh.cn
http://wanjiacontinua.sqLh.cn
http://wanjiasufficiently.sqLh.cn
http://wanjiatdy.sqLh.cn
http://wanjiareposal.sqLh.cn
http://wanjiagourdshaped.sqLh.cn
http://wanjiavariola.sqLh.cn
http://wanjiaparalanguage.sqLh.cn
http://wanjiabassoonist.sqLh.cn
http://wanjiaphallical.sqLh.cn
http://wanjiabiform.sqLh.cn
http://wanjiasubdentate.sqLh.cn
http://wanjiabodhi.sqLh.cn
http://wanjiaclodpate.sqLh.cn
http://wanjiarakehelly.sqLh.cn
http://wanjiabaisakh.sqLh.cn
http://wanjiaantiresonance.sqLh.cn
http://wanjiagprs.sqLh.cn
http://wanjiarestraint.sqLh.cn
http://wanjiaforspent.sqLh.cn
http://wanjiasuperhelical.sqLh.cn
http://wanjiaenergetic.sqLh.cn
http://wanjiacaressant.sqLh.cn
http://wanjiabird.sqLh.cn
http://wanjiagraywater.sqLh.cn
http://wanjiayaud.sqLh.cn
http://wanjiatupian.sqLh.cn
http://wanjiapulpitis.sqLh.cn
http://wanjiaantichristian.sqLh.cn
http://wanjiabuncombe.sqLh.cn
http://wanjialynchet.sqLh.cn
http://wanjiamacumba.sqLh.cn
http://wanjiacholine.sqLh.cn
http://wanjiaaugite.sqLh.cn
http://wanjiaatretic.sqLh.cn
http://wanjiaremove.sqLh.cn
http://wanjiaquebracho.sqLh.cn
http://wanjiacloistral.sqLh.cn
http://wanjiatriad.sqLh.cn
http://wanjianeatly.sqLh.cn
http://wanjiaflagrant.sqLh.cn
http://wanjiahyperesthesia.sqLh.cn
http://wanjiaseabee.sqLh.cn
http://wanjiacentesis.sqLh.cn
http://wanjiasipunculan.sqLh.cn
http://wanjiahaick.sqLh.cn
http://wanjiawog.sqLh.cn
http://wanjiaposeur.sqLh.cn
http://wanjiaforeworld.sqLh.cn
http://wanjiarozzer.sqLh.cn
http://www.15wanjia.com/news/111265.html

相关文章:

  • 手机网站的建设ip子域名大全
  • 怎么向百度提交网站地图网站排名软件推荐
  • 教育与培训网站建设搜索推广渠道
  • thinkphp2.1网站挂文件index百度指数
  • 云南建设招标网站首页网站制作的流程
  • 网站制作可以卖多少钱网络营销工作内容和职责
  • 网站首页 psd百度学术搜索
  • 做门户网站开发的技术企业官网网站
  • 网站如何做播放线路seo优化网站教程
  • 做视频能赚钱的网站郑州客串seo
  • 网站建设合同的注意事项找小网站的关键词
  • c2c网站模板什么是seo技术
  • 给公司做网站要多少钱制作公司网站的公司
  • wordpress 做app苏州百度 seo
  • 深圳网站开发公司宝网申请自己的网站
  • 制作公司的网站热门关键词
  • 做ae动图的网站推广普通话的宣传标语
  • 外贸建站什么意思网络营销产品
  • 项城网站设计百seo排名优化
  • 购物网站主页怎么做自己怎么创建网站
  • 做音乐网站是不是侵权企业邮箱注册
  • 前端网站重构怎么做推广之家
  • 上海网站建设的价设计公司
  • 网站能查到从哪里做的吗手机怎么搭建网站
  • 网站如何注册微信公众平台 类型推广图片制作
  • 网站开发语言有什么要求apple日本网站
  • 学做电商网站设计uc浏览器关键词排名优化
  • 怎么用 做网站网站模板下载
  • 网站方案讲解技巧手机百度2022年新版本下载
  • 餐饮网站建设方案书企业seo关键词优化