24.模块化

模块化

模块化

java成为一种影响深远的语言, 同时也变得越来越臃肿, 为了给java轻量化, Java9推出了模块化系统.

image-20201028104010641

模块的基本使用

基本使用步骤

  • 创建模块(按照以前的讲解方式)
  • 在模块的src下创建一个module-info.java描述文件, 该文件专门定义模块名, 访问权限, 模块依赖等信息, 描述文件使用模块导出和模块依赖来进行配置并使用
  • 模块所有未导出的包都是模块私有的, 无法在模块之外被访问
    • 在moduleOne模块描述文件中配置模块导出: exports 包名;
  • 一个模块要访问其他模块, 必须要明确指定依赖哪些模块, 未明确指定依赖的模块不能访问
    • 在moduleTwo模块描述文件中配置模块依赖: requires 模块名;
    • 注意: 写依赖模块报错时, 按下Alt+Enter提示, 选择模块依赖

image-20201028105720938

moduleOne/module-info.java

module moduleOne {
    exports package01;
    exports package02;
}

moduleTwo/module-info.java

module moduleTwo {
    requires moduleOne;
}

Student

package package01;

public class Student {
    public void study() {
        System.out.println("好好学习");
    }
}

Teacher

package package02;

public class Teacher {
    public void teach () {
        System.out.println("成就学生");
    }
}

模块服务的使用

服务使用者只面向接口编程, 但不清楚服务提供者的实现类, 允许服务提供者和服务使用者之间完成解耦

服务使用步骤

  • moduleOne下新建一个包package03, 在该包下提供一个接口, 接口中定义一个抽象方法

    public interface MyService{
    	void service();
    }
    
  • 在package03下创建impl包, 提供接口的两个实现类Service1和Service2

    Service1

    package package03.impl;
    
    import package03.MyService;
    
    public class Service1 implements MyService {
        @Override
        public void service() {
            System.out.println("服务1");
        }
    }
    

    Service2

    package package03.impl;
    
    import package03.MyService;
    
    public class Service2 implements MyService {
        @Override
        public void service() {
            System.out.println("服务2");
        }
    }
    
  • 在moduleOne模块下描述文件中添加如下配置

    服务模块: exports package03
    服务提供: provides MyService with Service1;  // 指定MyService的服务实现类是Service1
    
    import package03.MyService;
    import package03.impl.Service1;
    import package03.impl.Service2;
    
    module moduleOne {
        exports package01;
        exports package02;
        exports package03;
    
        // provides MyService with Service1;
        provides MyService with Service2;
    }
    
  • 在moduleTwo模块描述文件中添加如下配置

    声明服务接口: uses MyService;
    
    import package03.MyService;
    
    module moduleTwo {
        requires moduleOne;
        uses MyService;
    }
    
  • 在moduleTwo模块的类中使用MyService接口提供服务

    • ServiceLoader: 一种加载服务实现的工具

Test02

package pkg;

import package03.MyService;

import java.util.ServiceLoader;

public class Test02 {
    public static void main(String[] args) {
        // 加载服务
        ServiceLoader<MyService> myServices = ServiceLoader.load(MyService.class);

        // 遍历服务
        for(MyService my: myServices) {
            System.out.println(my);
             my.service();
        }
    }
}

注意: 如果报如下错误

Error:Kotlin: The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition

解决方案:

  • 菜单栏: Build --> Rebuild Project
原文地址:https://www.cnblogs.com/ryxiong-blog/p/13890641.html