zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    POJ-2528 Mayor's posters 线段树 离散化
    POJ 3468 A Simple Problem with Integers 线段树区间修改
    CodeForces
    POJ3208 Apocalypse Someday 数位DP经典绝世好题
    CodeForces114 Double Happiness 数论 二次筛法 bitset的应用
    P3146 [USACO16OPEN]248 G 区间DP 暴力DP
    【Python学习】requests短连接
    【Windows学习】免登录和自动登录
    【Linux学习】expect远程下载和上传样例
    【Linux学习】软件包管理-wget,rpm,yum,apt-get
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/13890641.html
Copyright © 2011-2022 走看看