1 模块化概述【理解】
Java 语言随着这些年的发展已经成为了一门影响深远的编程语言,无数平台,系统都采用 Java 语言编写。但是,伴 随着发展,Java 也越来越庞大,逐渐发展成为一门 “ 臃肿 ” 的语言。而且,无论是运行一个大型的软件系统,还是运 行一个小的程序,即使程序只需要使用Java 的部分核心功能, JVM 也要加载整个 JRE 环境。 为了给 Java“ 瘦身 ” ,让 Java实现轻量化, Java 9 正式的推出了模块化系统。 Java 被拆分为 N 多个模块,并允许 Java 程序可以根据需要选择加载程序必须的Java 模块,这样就可以让 Java 以轻量化的方式来运行
其实,Java 7 的时候已经提出了模块化的概念,但由于其过于复杂, Java 7 , Java 8 都一直未能真正推出,直到 Java 9才真正成熟起来。对于 Java 语言来说,模块化系统是一次真正的自我革新,这种革新使得 “ 古老而庞大 ” 的 Java 语言 重新焕发年轻的活力
2 模块的基本使用【应用】
2.1 必须是java文件夹下面才可以创建module-info.java,添加两个maven。module项目。
分别为one和two
module one { }
module two { }
2.2、设置模块的依赖和权限
2.2.1、设置modulej级别为9
2.2.2、one中创建两个包和方法
package com.oldlu.java9.can; public static class UtilCan { public void can(){ System.out.println("can"); } }
package com.oldlu.java9.cannot; public static class UtilCanNot { public void canNot(){ System.out.println("canNot"); } }
2.3、one中module-info.java
module one { //导出可用包 exports com.oldlu.java9.can; }
2.4、two中进行引入,如果发现为红报错,则,alt+enter进行one包的引入
module two { requires one; }
2.5、two中开始使用
package com.oldlu.java9.use; import com.oldlu.java9.can.UtilCan; //import com.oldlu.java9.cannot.UtilCanNot; //导入了,但是报错 public class Use { public static void main(String[] args) { UtilCan.can(); // UtilCanNot.canNot(); 可以导入,但是编译不成功 } }
3、模块化中的服务(Service接口)
3.1、创建接口和实现类
3.1.1、接口
package com.oldlu.java9.api; public interface MyServiceInter { void method(); }
3.1.2、实现类
package com.oldlu.java9.api.impl; import com.oldlu.java9.api.MyServiceInter; public class MyServiceInterImpl implements MyServiceInter { @Override public void method() { System.out.println("接口实现类"); } public static void staticImpl(){ System.out.println("接口实现类中自己定义的静态方法"); } }
3.1.3、第二个实现类
package com.oldlu.java9.api.impl; import com.oldlu.java9.api.MyServiceInter; public class MyServiceInterImplTwo implements MyServiceInter { @Override public void method() { System.out.println("第二个接口实现类"); } }
3.2、one module-info.java 服务开始提供
import com.oldlu.java9.api.MyServiceInter; import com.oldlu.java9.api.impl.MyServiceInterImpl; import com.oldlu.java9.api.impl.MyServiceInterImplTwo; module one { //导出可用包 exports com.oldlu.java9.can; //对外提供的接口服务 ,下面指定的接口以及提供服务的impl,如果有多个实现类,用用逗号隔开 exports com.hlj.java9.api; provides MyServiceInter with MyServiceInterImpl, MyServiceInterImplTwo; }
3.3、two模块开始调用
3.3.1、two module-info.java
import com.oldlu.java9.api.MyServiceInter; module two { requires one; //使用接口的名称 ,上面已经导入了one模块了 uses MyServiceInter ; }
3.3.2、开始测试使用 下面中的注释掉的解答下export必须是第一层才能够导出
package com.oldlu.java9.Consumer; import com.oldlu.java9.api.MyServiceInter; //import com.oldlu.java9.api.impl.MyServiceInterImpl; import java.util.ServiceLoader; /** * @Desc: * @Author admin */ public class ConsumerUse { public static void main(String[] args) { //专门用来提供服务的类 ServiceLoader<MyServiceInter> loader = ServiceLoader.load(MyServiceInter.class); //所有的实现类 for(MyServiceInter service:loader){ service.method(); } // MyServiceInterImpl.staticImpl(); ont中export必须是第一层包,不可以套多层 } }



