java 模块化_Java模块化方法–模块,模块,模块

java 模块化

我想每个人都会同意,编写模块化应用程序和模块化通常是一件好事。

但是,从Java和Scala语言以及各种Java / Scala框架来看,对模块化的支持看起来如何? 有很多不同的方法! 让我们看看其中的一些。 “保护”以下是指模块在编译时或运行时的分离程度。

配套

首先,我们有Java(或Scala)软件包 。 在组织源代码时,该概念非常有用。 但是,它不提供编译时或运行时(受程序包保护的可见性除外,它没有被广泛使用)保护,因此很难说程序包对模块化代码有任何帮助。 此外,还有很多命名问题,因此也有约定:例如,如果我们有两种数据读取器实现,一种使用数据库,另一种使用文件系统,则相关的类应该进入数据库和文件系统子包,还是保留在同样的顶级套餐? 即使类名在专用软件包中,也应在它们之前加上数据库和文件系统吗?

建立子项目

其次,有Maven / SBT模块/子项目 。 它们提供了编译时保护,这是一件非常好的事情:现在,我们可以静态地确保我们的代码仅引用显式指定的依赖项中的类。 但是,随之而来的是一个显而易见的问题:什么时候一个功能“足够大”以使其成为独立的Maven模块? 可以有很多Maven模块,每个模块仅包含几个类(可以是PITA,必须为每个类定义一个单独的pom,目录结构),还是应该更大一些? 关于命名约定,包名称应与模块名称相对应吗? 如果是这样,我们显然在这里违反了DRY ;)!

想象一下,我们决定将数据库和文件系统数据读取器放入单独的程序包,maven模块中,并适当命名它们。 因此,在myapp-database Maven模块的foo.bar.database包中,我们有一个DatabaseReader(外加10个帮助器类)。 现在,一个简单的重构:将“数据库”重命名为“ db”成为一项非常复杂的任务,最肯定的结果是在各个地方使用了各种术语。

OSGi

演进的下一步将是OSGi捆绑包 (或等效地,是JBoss Modules或Project Jigsaw中的 模块 )。 一个这样的捆绑包通常是一个(或多个)Maven模块的产品,但是它也通过适当地限定类加载器的范围来提供运行时保护。 Maven模块中的所有问题都被继承了……另外还需要命名包!

嵌套类/蛋糕图案

限制代码范围的另一种可能性是使用嵌套类 ,甚至更进一步,并在Scala中使用Cake模式 。 除了旧的问题:使用什么软件包以及如何命名模块类外,我们还有几个新问题。 首先,模块的整个源代码现在位于一个文件中。 这可能意味着文件很长! 但是,可能更多的是IDE问题:没有人说过需要一次编辑一个文件。 编辑器只能显示一个模块类/方法(例如在Smalltalk IDE中)。 蛋糕图案也不是没有问题 。 而且,嵌套模块又如何呢?

DI框架

最后,我们有各种DI框架 (例如Guice,Spring或CDI),如果从适当的角度来看,我们定义了可以依赖于其他模块(由容器注入)的小模块(类)。 将模块接口(java接口)与模块实现(java类)分开,并且仅注入接口也是很常见的。 但是,再次重申,部分静态地防止注入实现的唯一方法是,我们不得不求助于创建单独的-api和-impl Maven模块。

实际上,如果我们采用嵌套类的方法,那么DI框架可能非常适合解决模块间的依赖关系并为我们完成所有连接(如果我们想避免出现以下情况,这可能会非常有用:模块具有新的依赖关系,并且现在必须修改每个使用站点)。

下一个?

综上所述,我认为支持模块化的各种方法可以使用某种统一性。 而且,不幸的是,这可能意味着完全偏离我们今天从Java / Scala所了解的:新的软件包系统,新的构建系统,新的运行时系统。 不幸的是,新的编程语言的出现在该领域提供的并不多。

您是否认为应该有一个模块系统,可以在小型(单个类)和大型(类集)中使用? 毕竟, DI容器用来解决依赖关系和实例化类的操作与启动时MavenOSGi运行时的操作没有太大不同!

还是模块固有地具有几种类型,小型(类级别)和大型(maven模块/ osgi捆绑包级别)?

最后,也许还有其他一些非基于JVM的语言可以更好地解决模块化问题(仍然可用)?

参考: 模块,模块,模块……来自我们的JCG合作伙伴 Adam Warski 。

相关文章 :
  • JBoss模块示例–模块化Web应用程序
  • 真正的模块化Web应用程序:为什么没有开发标准?
  • OSGi将Maven与Equinox结合使用
  • Java最佳实践系列
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/10/java-modularity-approaches-modules.html

java 模块化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fastjson批量检查及一键利用工具

0x01 序章 上次讲解过手动利用fastjson,但讲的过于太简单了。根据大家的反应,收集如下几个问题。 1、如何盲打fastjson 2、判断fastjson的指纹 3、各版本payload以及使用ldap模式监听。 下面我就一一解答,我只是把我在网上查到的资料消化 后分…

动态规划--重拾我的“背包”

前言: 背包问题所涉及的是经典的动态规划算法。因为长时间不AC了,渐渐感觉思维也都麻了!本文将基础的背包问题做个小结,方便以后翻阅。感兴趣的朋友也可以阅读一下~------------------------(1)如何从n个重…

CSS3学习笔记总结,你值得拥有(呕心沥血之作,涵盖CSS3所有知识点)

目录 简介 边框 圆角 背景 渐变 文本效果 字体 2D转换 3D转换

Java 8 SE可选,严格的方法

大约两周前,Stephen Colebourne提出了使用Optional的实用方法 。 如果您阅读了它,您可能会从我以前的建议中猜到我不同意。 总览 我必须以免责声明开头,但随后我将直接解释为什么我认为他的方法不够理想。 所有不归因于他人的报价均摘自Ste…

routersploit简单实例

https://github.com/reverse-shell/routersploit RouterSploit。它包含了27个品牌的上百种漏洞利用模块,涉及的路由器、摄像头等设备有几百种。渗透的时候,用户首先根据目标设备的品牌选择对应的扫描模块,用以发现漏洞。一旦漏洞识别&#x…

《Spring3.0就这么简单》

第一章 认识Spring 1、Spring提供的IOC容器,是Spring大杀器之一。容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创建、拼接、管理、获取工作 2、Spring提供的第二大杀器&#xff…

前端面试题之http/HTML/浏览器(一)

1.cookie sessionStorage localStorage区别?答:cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递cookie数据还有路径(path)的概念,可以限制。cookie只属于某个路径下…

[Vulhub](WooYun-2016-199433)phpmyadmin反序列化漏洞

0x00 预备知识 什么是序列化 序列化 (serialize)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。【将状…

用户指南接口

在AppDelegate在代码 视图控制器里的 版权声明:本文博客原创文章。博客,未经同意,不得转载。 转载于:https://www.cnblogs.com/bhlsheji/p/4747547.html

前端面试题之http/HTML/浏览器(二)

csrf和xss的网络攻击及防范?答:CSRF:跨站请求伪造,可以理解为攻击者盗用了用户的身份,以用户的名义发送了恶意请求,比如用户登录了一个网站后,立刻在另一个ta&#xff42…

使用Spring Cloud休息客户电话

使用Spring-Cloud项目进行REST客户端调用有几种有趣的方法。 Spring-Cloud REST支持建立在核心Netflix OSS库的基础上,但将它们抽象化并在此过程中简化了库的使用。 RestTemplate 首先,让我们考虑使用RestTemplate通过基于Spring的应用程序进行Rest调用…

查看目标主机安装的杀毒软件

命令: wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe 参考链接:https://stackoverflow.com/questions/42472336/is-there-a-command-to-check-if-there-was-any-antivirus-insta…

Netty系列之Netty百万级推送服务设计要点

原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑…

上架APPStore需要准备哪些材料?

前端时间用敏捷式开发平台开发了一款APP应用,应用名称我就不说啦,这篇文章主要讲述一下上架苹果应用商店APPStore需要准备哪些材料,有相关的困扰欢迎私信我。一、上架流程1. 注册苹果企业账号2. 创建测试证书,发布证书 (使用Mac)3…

浅谈C++设计模式之工厂方法(Factory Method)

为什么要用设计模式?根本原因是为了代码复用,增加可维护性。 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP)、里氏代换原则(Liskov Substitution Principle,LSP&…

上架Android应用到腾讯应用包、百度手机助手、华为应用市场、小米应用商店、阿里应用分发平台需要准备哪些材料?...

前端时间用敏捷式开发平台开发了一款APP应用,应用名称我就不说啦,这篇文章主要讲述一下上架各大安卓应用商店(腾讯应用宝、阿里应用商店、百度手机助手、华为应用市场、小米应用商店)需要准备哪些材料,有相关的困扰欢迎…

java并发队列_Java并发教程–阻塞队列

java并发队列如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱。 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列。 队列 首先,简要回顾一下什么是标准队列。 …

BBScan:信息泄漏批量扫描脚本

有些朋友手上有几十万甚至上百万个域名,如果把这些域名全部扔给wvs、 APPscan这样的重型扫描器,显然是不太合适的。 对于一个拥有上万IP的企业,又如何快速定位可能存在弱点的机器呢? 试试信息泄漏批量扫描脚本 BBScan。 BBScan是一…

【APICloud系列|18】上架Android应用到腾讯应用包、百度手机助手、华为应用市场、小米应用商店、阿里应用分发平台需要准备哪些材料?

前端时间用敏捷式开发平台开发了一款APP应用,应用名称我就不说啦,这篇文章主要讲述一下上架各大安卓应用商店(腾讯应用宝、阿里应用商店、百度手机助手、华为应用市场、小米应用商店)需要准备哪些材料,有相关的困扰欢迎私信我。 一、应用商店选择 推荐平台(六选五) 1.…

Activiti 6中的可插拔持久性

在过去的几年中,我们经常听到(来自社区和我们的客户)关于如何将Activiti的持久性逻辑从关系数据库交换到其他内容的请求。 当我们宣布Activiti 6时, 我们做出的承诺之一就是我们将实现这一目标。 深入研究Activiti引擎代码的人会…