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
  • 相关阅读:
    工作感悟(一)
    laydate组件选择时间段的判断
    Win10下免安装版JDK8环境变量配置
    IDEA中lombok插件的安装
    解决加载WEB页面时,由于JS文件引用过多影响页面打开速度的问题
    Windows环境下的MYSQL5.7配置文件定位
    MYSQL使用source命令,导入SQL文件
    MYSQL5.7生成列简介及创建
    MYSQL慢查询优化方法及优化原则
    批量提取文件夹下所有目录及文件名称
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/13890641.html
Copyright © 2011-2022 走看看