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

泸州市网站建设_网站建设公司_表单提交_seo优化

网站建设费入什么科目2018,新农村建设网站知乎,建设评标专家在哪个网站,网站建设美工招聘编写脚本电脑怎么编写界面脚本编写是使您的应用程序在运行时就可根据客户需求进行调整的最流行的方法之一。 与往常一样#xff0c;此方法不仅带来好处#xff0c;例如#xff0c;在灵活性和可管理性之间存在众所周知的折衷方案。 本文不是从理论上讨论优缺点的文章之一此方法不仅带来好处例如在灵活性和可管理性之间存在众所周知的折衷方案。 本文不是从理论上讨论优缺点的文章之一它实际上展示了如何采用脚本的不同方式并介绍了一个Spring库该库提供了方便的脚本基础结构和有用的功能。 介绍 脚本又称插件架构是使应用程序在运行时可自定义的最直接方法。 通常脚本不是偶然进入设计的而是偶然进入应用程序的。 说您在功能规范中有一个非常不清楚的部分因此为了避免浪费一天来进行额外的业务分析我们决定创建一个扩展点并调用一个实现存根的脚本这将阐明以后的工作方式。 使用这种方法有很多众所周知的利弊例如在运行时定义业务逻辑的灵活性非常高并且可以节省大量的重新部署时间而无法进行全面的测试因此安全性性能问题是无法预测的问题等等。 对于已经决定在其Java应用程序中坚持使用脚本插件的人或者只是考虑将其添加到其代码中的人进一步讨论的脚本编写方法可能会有所帮助。 没什么特别的只是脚本 使用Java的JSR-233 API用Java评估脚本是一项简单的任务。 为此API实现了许多生产级评估引擎NashornJRubyJython等因此向Java代码中添加一些脚本魔术不是问题如下所示 Map parameters createParametersMap();ScriptEngineManager manager new ScriptEngineManager();ScriptEngine scriptEngine manager.getEngineByName(groovy);Object result scriptEngine.eval(script.getScriptAsString(discount.groovy), new SimpleBindings(parameters)); 显然当代码库中有多个脚本文件和一个调用时将这样的代码分散在整个应用程序中并不是一个好主意因此您可以将此代码段提取到放置到实用程序类的单独方法中。 有时您甚至可以走得更远您可以创建一个特殊的类或类集以基于业务域将脚本化的业务逻辑分组例如PricingScriptService类。 这将使我们将对validateGroovy 的调用包装到一个不错的强类型方法中但是仍然有一些样板代码所有方法都将包含参数映射脚本文本加载逻辑和脚本评估引擎调用类似于以下内容 public BigDecimal applyCustomerDiscount(Customer customer, BigDecimal orderAmount) {Map params new HashMap();params.put(cust, customer);params.put(amount, orderAmount);return (BigDecimal)scripting.evalGroovy(getScriptSrc(discount.groovy), params); } 这种方法在了解参数类型和返回值类型方面带来了更大的透明度。 并且不要忘了在编码标准文档中添加禁止“未包装”脚本引擎调用的规则 类固醇脚本 尽管使用脚本引擎非常简单但是如果代码库中有很多脚本您可能会遇到一些性能问题。 举个例子–您使用Groovy模板进行报告并同时运行许多报告。 迟早您会发现“简单”脚本正在成为性能瓶颈。 这就是为什么某些框架在现有API上构建自己的脚本引擎的原因并添加了一些不错的功能以实现更好的性能执行监视多语言脚本等。 例如在CUBA框架中有一个相当复杂的脚本引擎该引擎实现了一些功能来改善脚本的实现和执行例如 类缓存以避免重复的脚本编译。 能够使用Groovy和Java语言编写脚本。 用于脚本引擎管理的JMX bean。 所有这些都提高了性能和可用性但是它们仍然是用于创建参数映射获取脚本文本等的低级API因此我们仍然需要将它们分组为高阶模块以在应用程序中有效地使用脚本。 更何况是不提及新的实验性GraalVM引擎及其允许使用其他语言扩展Java应用程序的多语言API。 因此也许我们会看到Nashorn早晚退休并且能够在相同的源文件中使用不同的编程语言进行编写但是将来仍然如此。 Spring框架很难拒绝的提议 在Spring Framework中我们对JDK的API提供了内置的脚本支持您可以在org.springframework.scripting。*包中找到很多有用的类。 这里有评估人员工厂等。所有构建您自己的脚本支持所需的工具。 除了底层API之外Spring Framework的实现还应简化应用程序中脚本的处理-您可以按照文档中的描述定义以动态语言实现的bean。 您需要做的就是使用动态语言例如Groovy实现一个类并在配置XML中描述一个bean如下所示 lang:groovy idmessenger script-sourceclasspath:Messenger.groovylang:property namemessage valueI Can Do The Frug / /lang:groovy 之后您可以使用XML config将Messenger Bean注入到您的应用程序类中。 可以在基础脚本更改的情况下自动“刷新”该bean并与AOP等一起使用。 这种方法看起来不错但是作为开发人员如果您想利用动态语言支持的所有功能则应该为您的bean实现成熟的类。 在现实生活中脚本可能只是纯函数因此您需要向脚本中添加一些额外的代码以使其与Spring兼容。 如今也有一些开发人员认为XML配置与注释相比是“过时的”并试图避免使用它因为Bean定义和注入在Java代码和XML代码之间进行了划分。 尽管它更多是一个品味问题而不是性能/兼容性/可读性等问题但我们可以考虑到它。 脚本挑战和想法 因此一切都有其代价当您向应用程序中添加脚本时您可能会遇到一些挑战 可管理性–通常脚本分散在应用程序中因此很难管理大量的valuateGroovy 或类似调用。 可发现性–如果调用脚本中出现问题则很难在源代码中找到实际要点。 我们应该能够在IDE中轻松找到所有脚本调用点。 透明度–编写脚本扩展不是一件容易的事因为没有有关发送到脚本的变量的信息也没有有关应返回的结果的信息。 最后脚本只能由开发人员完成并且只能查看源代码。 测试和更新–部署更新新脚本始终很危险没有回滚的方法也没有工具可以在生产前进行测试。 似乎在常规Java方法下隐藏脚本化方法调用可以解决大多数这些挑战。 首选方式–注入“脚本化” bean并使用有意义的名称调用其方法而不是仅从实用工具类中调用另一个“ eval”方法。 因此我们的代码正变得自我记录开发人员无需查看文件“ disc_10_cl.groovy”即可确定参数名称类型等。 另一个优势–如果所有脚本都有与之关联的唯一Java方法则可以使用IDE中的“查找用法”功能轻松找到应用程序中的所有扩展点以及了解该脚本的参数及其含义。返回。 这种执行脚本的方式也使测试变得更加简单–我们不仅能够“照常”测试这些类而且还可以在需要时使用模拟框架。 所有这些都使我们想起了本文开头提到的方法–脚本方法的“特殊”类。 而且如果我们更进一步并隐藏开发人员对脚本引擎参数创建等的所有调用该怎么办 脚本存储库概念 这个想法非常简单并且所有使用Spring Framework的开发人员都应该熟悉。 我们只是创建一个Java接口并将其方法以某种方式链接到脚本。 例如Spring Data JPA使用类似的方法其中接口方法根据方法名称转换为SQL查询然后由ORM引擎执行。 我们可能需要执行什么概念 可能是一个类级别的注释它将帮助我们检测脚本存储库接口并为其构造一个特殊的Spring bean。 方法级别的注释将帮助我们将方法链接到其脚本实现。 最好为该方法提供一个默认实现它不是简单的存根而是业务逻辑的有效部分。 在我们实现由业务分析师开发的算法之前该方法将一直有效。 或者我们可以让他/她编写此脚本:-) 假设您需要创建一个服务来根据用户个人资料计算折扣。 而且业务分析师说我们可以放心地假设默认情况下可以为所有注册客户提供10的折扣。 对于这种情况我们可能会考虑以下代码概念 ScriptRepository public interface PricingRepository {ScriptMethoddefault BigDecimal applyCustomerDiscount(Customer customer,BigDecimal orderAmount) {return orderAmount.multiply(new BigDecimal(0.9));} } 当涉及适当的折扣算法实现时groovy脚本将如下所示 -------- file discount.groovy -------- def age 50 if ((Calendar.YEAR - cust.birthday.year) age) {return amount.multiply(0.75) } -------- 所有这些的最终目标–让开发人员仅实现唯一的接口和折扣算法脚本并且不要迷失所有这些“ getEngine”和“ eval”调用。 脚本解决方案应该发挥所有魔力当方法被调用时拦截调用查找并加载脚本文本对其进行评估并返回结果或者如果找不到脚本文本则执行默认方法。 理想用法应与此类似 Service public class CustomerServiceBean implements CustomerService {Injectprivate PricingRepository pricingRepository;//Other injected beans hereOverridepublic BigDecimal applyCustomerDiscount(Customer cust, BigDecimal orderAmnt) {if (customer.isRegistered()) {return pricingRepository.applyCustomerDiscount(cust, orderAmnt);} else {return orderAmnt;}//Other service methods here} 脚本调用是可读的我猜想任何Java开发人员都熟悉脚本的调用方式。 这些就是想法它们被用来为使用Spring Framework实现脚本存储库创建一个库。 该库具有用于从不同来源加载和评估脚本文本的功能以及一些API允许开发人员在需要时实现库的扩展。 这个怎么运作 该库引入了一些注释以及那些喜欢它的人的XML配置这些注释在上下文初始化期间为所有标记有ScriptRepository注释的存储库接口启动动态代理构建。 这些代理以实现存储库接口的单例bean的形式发布这意味着您可以使用Autowired或Inject将这些代理完全注入到您的bean中如上一节中的代码片段所示。 在应用程序配置类之一上使用EnableSpringRepositories批注可激活脚本存储库。 这种方法类似于其他熟悉的Spring注释例如EnableJpaRepositories或EnableMongoRepositories。 并且对于此批注您需要指定应类似于JPA存储库进行扫描的软件包名称数组。 Configuration EnableScriptRepositories(basePackages {com.example, com.sample}) public class CoreConfig { //More configuration here. } 如前所示我们需要使用ScriptMethod标记脚本存储库中的每个方法库还提供GroovyScript和JavaScript 以将元数据添加到这些调用中并指示这些方法已编写脚本。 当然还支持脚本方法的默认实现。 解决方案的所有组件都显示在下图中。 蓝色形状与应用程序代码相关白色形状与库相关。 Spring Bean标记有春天徽标。 调用接口的脚本化方法时该代理类将拦截该代理类该代理类将对两个bean执行查找-提供程序以实现脚本文本以及评估程序以获取结果。 脚本评估后结果将返回到调用服务。 提供程序和评估程序都可以在ScriptMethod批注属性以及执行超时中指定尽管库提供了这些属性的默认值 ScriptRepository public interface PricingRepository {ScriptMethod (providerBeanName resourceProvider,evaluatorBeanName groovyEvaluator,timeout 100) default BigDecimal applyCustomerDiscount(ScriptParam(cust) Customer customer,ScriptParam(amount) BigDecimal orderAmount) {return orderAmount.multiply(new BigDecimal(0.9)); } } 您可能会注意到ScriptParam批注–我们需要它们为方法的参数提供名称。 这些名称应在脚本中使用因为Java编译器会在编译时删除实际的参数名称。 您可以省略这些注释在这种情况下您需要将脚本的参数命名为“ arg0”“ arg1”等这会影响代码的可读性。 默认情况下该库具有可从两种脚本语言的文件系统和基于JSR-233的评估程序读取groovy和javascript文件的提供程序。 但是您可以为不同的脚本存储和执行引擎创建自定义提供程序和评估程序。 所有这些功能都基于Spring框架接口 org.springframework.scripting.ScriptSource和org.springframework.scripting.ScriptEvaluator 因此您可以重用所有基于Spring的类例如StandardScriptEvaluator而不是默认类。 提供程序以及评估程序以Spring Bean的形式发布因为脚本存储库代理为了灵活性而按名称解析它们-您可以用新的executor代替默认的执行程序而无需更改应用程序代码而是在应用程序上下文中替换一个Bean。 测试和版本控制 由于可以轻松更改脚本因此我们需要确保在更改脚本时不会破坏生产服务器。 该库与JUnit测试框架兼容没有什么特别的。 由于您在基于Spring的应用程序中使用脚本因此可以将单元测试和集成测试作为应用程序的一部分来测试脚本然后再将其上传到生产环境因此还支持模拟。 另外您可以创建一个脚本提供程序以从数据库甚至从Git或其他源代码控制系统读取不同的脚本文本版本。 在这种情况下如果生产中出现问题则很容易切换到较新的脚本版本或回滚到以前的脚本版本。 结论 该库将帮助您在代码中安排脚本提供以下内容 通过引入Java接口开发人员始终可以获得有关脚本参数及其类型的信息。 提供程序和评估程序可帮助您摆脱分散在应用程序代码中的脚本引擎调用。 通过使用“查找用法引用” IDE命令或仅通过方法名称进行简单的文本搜索我们可以轻松地在应用程序代码中找到所有脚本用法。 在此Spring Boot的基础上还支持自动配置您还可以使用熟悉的单元测试和模拟技术在将脚本部署到生产之前测试脚本。 该库具有用于在运行时获取脚本元数据方法名称参数等的API如果您希望避免编写try..catch块来处理脚本抛出的异常则可以获取包装的执行结果它还支持XML配置如果您希望以这种格式存储配置。 另外可以通过注释中的超时参数来限制脚本执行时间。 可以在https://github.com/cuba-rnd/spring-script-repositories找到库资源。 翻译自: https://www.javacodegeeks.com/2018/11/incomprehensible-situation-scripting.html编写脚本电脑怎么编写界面
http://www.lebaoying.cn/news/11638.html

相关文章:

  • 义乌制作网站开发网站托管服务合同范本
  • 西宁做网站的公司力请君博d在线图片编辑器图片编辑
  • 麻城网站建设网络推广公司招聘
  • 网站建设 知乎ip代理池
  • logo设计网站知乎效果好的网站制作
  • 建一个区域网站需要多少资金2022网络热词30个
  • 自己做网站跟域名怎样做沈阳企业网站建设公司
  • 网站建设公司找哪家好wordpress换头像不显示不出来
  • 销售型网站wordpress yeti2.0
  • 代做网页制作网站网上定做衣服
  • 广东省住房和建设局网站西双版纳建设厅网站
  • 网站设置字体样式wordpress缩进去的边栏
  • 做公司网站软件网站建设厘金手指下拉15
  • 电子商务网站建设技术基础--asp.net程序设计教学大纲网站检测器
  • 论文查重网站建设安阳那里可以制作网站
  • 哪里有做彩票网站了详细介绍网站建设的整个流程
  • wordpress 页面链接到分类喀什seo排名
  • 公众平台网站价格php可以做视频网站有哪些
  • 有没有专业做盐的网站wordpress加载更多文章
  • 旅游网站建设价格做网站的属于什么
  • 营销型网站建设818gx网站建设哪家公司好一点
  • 番禺网站 优化珠海 网页设计
  • 佛山网站建设公司名单苏州网站排名优化
  • 网站集约化平台建设分析建设部人才交流中心网站
  • 网站开发相关参考文献资料温州建站方案
  • 比特币支付网站建设做手机app用什么软件
  • app开发cms网站开发自己名字怎么设计logo
  • 漂亮的手机网站模板下载详情页设计教程
  • 网站模板编辑六安网新闻
  • 网站结构是体现的建设网站好公司简介