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

阿里云1M做网站html后缀的网站

阿里云1M做网站,html后缀的网站,html网页设计思路,自己做一元夺宝网站目录 一、策略模式 二、Spring Plugin 2.1 Spring Plugin 实现策略模式开发 2.2 策略模式优缺点 三、Spring Plugin 原理 一、策略模式 策略模式是一种设计模式#xff0c;它允许程序在运行中动态的选择不同的行为方式进行动态执行。策略模式的核心思想是将行为封装在一个个…目录 一、策略模式 二、Spring Plugin 2.1 Spring Plugin 实现策略模式开发 2.2 策略模式优缺点 三、Spring Plugin 原理 一、策略模式 策略模式是一种设计模式它允许程序在运行中动态的选择不同的行为方式进行动态执行。策略模式的核心思想是将行为封装在一个个独立的类中这些类实现了相同的接口或抽象类客户端可以通过接口来调用不同的实现而不知道具体的实现细节。下面来看一个具体的案例。 现在的移动支付非常的便捷而且有很多支付方式假如让你负责支付路由的设计该如何设计如何实现支付渠道的选择的呢 比如用户支付时可以选择支付宝、微信、银行卡那系统底层是如何进行操作的后期如果在加入新的支付方式该如何进行扩展呢 当然如果你使用 if else 肯定是能实现的但这种代码可读性差、可维护性差而且不利于扩展使用策略模式就能优雅的解决这些问题。 二、Spring Plugin Spring Plugin 是 Spring 框架的一个扩展用于实现插件化开发。它提供了插件注册、加载、卸载等功能。Spring Plugin 提供了一种简单而有效的方式来实现插件化开发使得应用程序能够更加灵活和易于维护。 下面通过 Spring Plugin 来实现上面提到的支付路由的策略模式。 2.1 Spring Plugin 实现策略模式开发 引入依赖 dependencygroupIdorg.springframework.plugin/groupIdartifactIdspring-plugin-core/artifactIdversion指定版本/version /dependency 定义支付方式接口 public interface PaymentStrategy extends PluginString {/*** 支付路由选择** param paymentReq 待处理的订单信息, 入参中携带支付标识* return*/PayResult pay(PaymentReq paymentReq); } 具体的支付实现 // 支付宝支付实现 Service public class AliPayService implements PaymentStrategy {Overridepublic PayResult pay(PaymentReq paymentReq) {// 模拟支付宝支付流程return new PayResult();}Overridepublic boolean supports(String payment) {// 支付方式是否为支付宝这里简化一些正常情况下需要使用枚举return alipay.equals(payment);} }// 微信支付实现 Service public class WechatPayService implements PaymentStrategy {Overridepublic PayResult pay(PaymentReq paymentReq) {// 模拟微信支付流程return new PayResult();}Overridepublic boolean supports(String payment) {// 支付方式是否为微信这里简化一些正常情况下需要使用枚举return wechatpay.equals(payment);} } 假如后期要加入银联支付方式相信你一定知道如何实现了吧。 定义插件配置 Configuration EnablePluginRegistries({PaymentStrategy.class}) public class StrategyConfig {} 使用支付方式进行支付操作 RestController public class PaymentController {Autowiredprivate PluginRegistryPaymentStrategy, String registry;PostMapping(value /pay)public PayResult pay(PaymentReq req) {PaymentStrategy strategy registry.getRequiredPluginFor(req.getPaymentType());return strategy.pay(req);} } 上述即时使用 Spring Plugin 实现策略模式的案例是不是很简单呢。 2.2 策略模式优缺点 策略模式的优点很明显有以下优点 扩展性使用策略模式时如果要添加新的策略十分方便也很简单不用修改原有的代码扩展性好。解耦客户端调用时只需要知道策略接口而具体的实现不必担心。动态性可以在运行时动态进行不同策略的切换提高了灵活性和适应性。 但是也有一定的缺点为了实现每个策略类都需要一个新的类进行独立的封装增加了复杂性。但是与其扩展性来说这点实际上是可以忽略的。 三、Spring Plugin 原理 开启 Spring Plugin 功能的入口是 EnablePluginRegistries 注解先看一下其实现。 Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited Documented Import(PluginRegistriesBeanDefinitionRegistrar.class) public interface EnablePluginRegistries {/*** The {link Plugin} types to register {link PluginRegistry} instances for. The registries will be named after the* uncapitalized plugin type extended with {code Registry}. So for a plugin interface {code SamplePlugin} the* exposed bean name will be {code samplePluginRegistry}. This can be used on the client side to make sure you get* the right {link PluginRegistry} injected by using the {link Qualifier} annotation and referring to that bean* name. If the auto-generated bean name collides with one already in your application you can use the* {link Qualifier} annotation right at the plugin interface to define a custom name.* * return*/Class? extends Plugin?[] value();} 该注解声明了需要开启插件化能力的接口并且导入了PluginRegistriesBeanDefinitionRegistrar它是一个 ImportBeanDefinitionRegistrar会在 Spring Boot 启动的时候执行 registerBeanDefinitions 方法。registerBeanDefinitions 方法实现如下 Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {MapString, Object annotationAttributes importingClassMetadata.getAnnotationAttributes(EnablePluginRegistries.class.getName());if (annotationAttributes null) {LOG.info(No EnablePluginRegistries annotation found on type {}!, importingClassMetadata.getClassName());return;}Class?[] types (Class?[]) annotationAttributes.get(value);for (Class? type : types) {BeanDefinitionBuilder builder BeanDefinitionBuilder.rootBeanDefinition(PluginRegistryFactoryBean.class);builder.addPropertyValue(type, type);RootBeanDefinition beanDefinition (RootBeanDefinition) builder.getBeanDefinition();beanDefinition.setTargetType(getTargetType(type));Qualifier annotation type.getAnnotation(Qualifier.class);// If the plugin interface has a Qualifier annotation, propagate that to the bean definition of the registryif (annotation ! null) {AutowireCandidateQualifier qualifierMetadata new AutowireCandidateQualifier(Qualifier.class);qualifierMetadata.setAttribute(AutowireCandidateQualifier.VALUE_KEY, annotation.value());beanDefinition.addQualifier(qualifierMetadata);}// DefaultString beanName annotation null //? StringUtils.uncapitalize(type.getSimpleName() Registry) //: annotation.value();registry.registerBeanDefinition(beanName, builder.getBeanDefinition());}} registerBeanDefinitions 从 EnablePluginRegistries 解析出插件接口然后注册成     PluginRegistryFactoryBean 类型的 BeanDefination。 PluginRegistryFactoryBean 是一个 FactoryBean所以注入 PluginRegistry 类型的时候实际是调用 PluginRegistryFactoryBean 的 getObject 返回的内容。 public class PluginRegistryFactoryBeanT extends PluginS, S extends AbstractTypeAwareSupportTimplements FactoryBeanPluginRegistryT, S {NonNullpublic OrderAwarePluginRegistryT, S getObject() {return OrderAwarePluginRegistry.of(getBeans());}NonNullpublic Class? getObjectType() {return OrderAwarePluginRegistry.class;}public boolean isSingleton() {return true;} } 注入的时候返回的类型是 OrderAwarePluginRegistry注入调用 getObject 返回里边调用了父类 AbstractTypeAwareSupport 的 getBeans 方法。 protected ListT getBeans() {TargetSource targetSource this.targetSource;if (targetSource null) {throw new IllegalStateException(Traget source not initialized!);}ProxyFactory factory new ProxyFactory(List.class, targetSource);return (ListT) factory.getProxy(); }public void afterPropertiesSet() {ApplicationContext context this.context;if (context null) {throw new IllegalStateException(ApplicationContext not set!);}Class? type this.type;if (type null) {throw new IllegalStateException(No type configured!);}this.targetSource new BeansOfTypeTargetSource(context, type, false, exclusions); } 由于实现了 InitializingBean 接口初始化时会获取到 ApplicationContext 上下文基于上下文的 type 封装成 BeansOfTypeTargetSource 赋值给 targetSource 变量BeansOfTypeTargetSource 实现了 TargetSourcegetTarget返回基于实际类型封装的增强类型。 class BeansOfTypeTargetSource implements TargetSource {NonNullSuppressWarnings({ rawtypes, unchecked })public synchronized Object getTarget() throws Exception {CollectionObject components this.components null //? getBeansOfTypeExcept(type, exclusions) //: this.components;if (frozen this.components null) {this.components components;}return new ArrayList(components);}private CollectionObject getBeansOfTypeExcept(Class? type, CollectionClass? exceptions) {return Arrays.stream(context.getBeanNamesForType(type, false, eagerInit)) //.filter(it - !exceptions.contains(context.getType(it))) //.map(it - context.getBean(it)) //.collect(Collectors.toList());} } getBeans 方法,会基于动态代理将 BeansOfTypeTargetSource 创建成 List 类型代理对象备用。然后回到 PluginRegistryFactoryBean 的 getObject 方法,会最终将插件接口实现封装成OrderAwarePluginRegistry 类型。 也就是说通过 PluginRegistryFactoryBean 注入的 PluginRegistry 是包含了所有实现了插件接口实例的封装类型,我们常用到的有 getPlugins 和 getPluginFor 方法: Override public ListT getPlugins() {return Collections.unmodifiableList(super.getPlugins()); }Override public OptionalT getPluginFor(S delimiter) {return super.getPlugins().stream()//.filter(it - it.supports(delimiter))//.findFirst(); }到这里基本上就可以了解其工作原理了。 往期经典推荐 从新手到高手Spring AOP的进阶指南_springaop切面优先级-CSDN博客 Sentinel与Nacos强强联合构建微服务稳定性基石的重要实践_sentinel nacos-CSDN博客 从0开始理解云原生架构_云原生发展历史-CSDN博客 TiDB高手进阶揭秘自增ID热点现象与高级调优技巧_tidb 自增id-CSDN博客 SpringBoot项目并发处理大揭秘你知道它到底能应对多少请求洪峰_一个springboot能支持多少并发-CSDN博客
http://www.zqtcl.cn/news/641479/

相关文章:

  • 做外链等于网站更新么台州椒江网站建设
  • 自己搭建一个博客网站网络营销是什么大类
  • 10元网站备案php企业网站开发实训报告
  • 建筑网站设计大全wordpress模板死循环
  • 网站优化排名软件泌阳网站建设
  • 网站反向绑定域名企业网站的建立网络虚拟社区时对于企业
  • 重庆大渡口网站建设解决方案梓潼 网站建设 有限公司
  • 高端平面网站东营住房和城乡建设厅网站
  • 品牌网站建设e小蝌蚪易时代网站
  • 做搜狗手机网站点击软网站建设有哪些种类
  • 想自学做网站太原要做网站的公司
  • 站内seo优化淘宝网站推广策划方案
  • 福建建设执业注册中心网站网址格式怎么写
  • 网站开发外包公司坑襄垣城乡建设管理局的网站
  • 网络公司怎么做网站常州新北区网站建设
  • 扬州专业外贸网站建设推广做详情页上什么网站找素材
  • 北京做网站设计招聘深圳市住房和建设局官网平台
  • 冻品网站建设网站头图设计
  • 手机网站分辨率做多大h5微网站建设多少钱
  • 网站制作软件下载公司怎么注册邮箱帐号
  • 做婚纱网站的图片园林设计
  • 濮阳公司建站淮北城市住建网
  • 建设银行网站打不开 显示停止工作专门做地图的网站
  • 有没有人一起做网站app网站建设方案
  • 洛阳网站建设兼职企业网站建设文案
  • 动漫制作贵州seo策略
  • asp网站建设项目实训该怎么跟程序员谈做网站
  • 网站软件资源iis不能新建网站
  • 网站设计的发展趋势西安市建设工程交易网
  • 做外贸收费的服装网站武钢建设公司网站