• 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
  • 相关阅读:
    461. Hamming Distance
    342. Power of Four
    326. Power of Three
    368. Largest Divisible Subset java solutions
    95. Unique Binary Search Trees II java solutions
    303. Range Sum Query
    160. Intersection of Two Linked Lists java solutions
    88. Merge Sorted Array java solutions
    67. Add Binary java solutions
    14. Longest Common Prefix java solutions
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/13890641.html
Copyright © 2020-2023  润新知