本文目录导读:

我将为您提供一个完整的Java模块化系统案例,使用JPMS(Java Platform Module System)构建一个简单的图书管理应用。
项目结构
book-management-system/
├── src/
│ ├── book.api/
│ │ ├── module-info.java
│ │ └── com/bookapp/api/
│ │ ├── Book.java
│ │ └── BookService.java
│ ├── book.core/
│ │ ├── module-info.java
│ │ └── com/bookapp/core/
│ │ ├── BookServiceImpl.java
│ │ └── BookRepository.java
│ ├── book.database/
│ │ ├── module-info.java
│ │ └── com/bookapp/db/
│ │ └── DatabaseBookRepository.java
│ └── book.app/
│ ├── module-info.java
│ └── com/bookapp/main/
│ └── MainApplication.java
模块代码示例
book.api 模块
module-info.java
module book.api {
exports com.bookapp.api;
}
Book.java
package com.bookapp.api;
public class Book {
private String id;
private String title;
private String author;
private String isbn;
private double price;
public Book(String id, String title, String author, String isbn, double price) {
this.id = id;
this.title = title;
this.author = author;
this.isbn = isbn;
this.price = price;
}
public String getId() { return id; }
public String getTitle() { return title; }
public String getAuthor() { return author; }
public String getIsbn() { return isbn; }
public double getPrice() { return price; }
@Override
public String toString() {
return "Book{id='" + id + "', title='" + title + "', author='" + author +
"', isbn='" + isbn + "', price=" + price + "}";
}
}
BookService.java
package com.bookapp.api;
import java.util.List;
import java.util.Optional;
public interface BookService {
void addBook(Book book);
Optional<Book> findBookById(String id);
List<Book> getAllBooks();
void updateBook(Book book);
void deleteBook(String id);
}
book.core 模块
module-info.java
module book.core {
requires book.api;
requires book.database;
exports com.bookapp.core;
uses com.bookapp.db.BookRepository;
}
BookServiceImpl.java
package com.bookapp.core;
import com.bookapp.api.Book;
import com.bookapp.api.BookService;
import com.bookapp.db.BookRepository;
import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
public class BookServiceImpl implements BookService {
private final BookRepository repository;
public BookServiceImpl() {
// 使用ServiceLoader进行服务发现
this.repository = ServiceLoader.load(BookRepository.class)
.findFirst()
.orElseThrow(() -> new RuntimeException("没有找到BookRepository的实现"));
}
@Override
public void addBook(Book book) {
repository.save(book);
}
@Override
public Optional<Book> findBookById(String id) {
return repository.findById(id);
}
@Override
public List<Book> getAllBooks() {
return repository.findAll();
}
@Override
public void updateBook(Book book) {
repository.update(book);
}
@Override
public void deleteBook(String id) {
repository.delete(id);
}
}
book.database 模块
module-info.java
module book.database {
requires book.api;
exports com.bookapp.db;
provides com.bookapp.db.BookRepository with com.bookapp.db.DatabaseBookRepository;
}
BookRepository.java
package com.bookapp.db;
import com.bookapp.api.Book;
import java.util.List;
import java.util.Optional;
public interface BookRepository {
void save(Book book);
Optional<Book> findById(String id);
List<Book> findAll();
void update(Book book);
void delete(String id);
}
DatabaseBookRepository.java
package com.bookapp.db;
import com.bookapp.api.Book;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class DatabaseBookRepository implements BookRepository {
private final Map<String, Book> bookStore = new ConcurrentHashMap<>();
@Override
public void save(Book book) {
bookStore.put(book.getId(), book);
System.out.println("[数据库] 保存书籍: " + book);
}
@Override
public Optional<Book> findById(String id) {
return Optional.ofNullable(bookStore.get(id));
}
@Override
public List<Book> findAll() {
return bookStore.values().stream()
.sorted(Comparator.comparing(Book::getId))
.collect(Collectors.toList());
}
@Override
public void update(Book book) {
if (bookStore.containsKey(book.getId())) {
bookStore.put(book.getId(), book);
System.out.println("[数据库] 更新书籍: " + book);
} else {
throw new IllegalArgumentException("书籍不存在: " + book.getId());
}
}
@Override
public void delete(String id) {
if (bookStore.remove(id) != null) {
System.out.println("[数据库] 删除书籍: " + id);
} else {
throw new IllegalArgumentException("书籍不存在: " + id);
}
}
}
book.app 模块
module-info.java
module book.app {
requires book.api;
requires book.core;
}
MainApplication.java
package com.bookapp.main;
import com.bookapp.api.Book;
import com.bookapp.api.BookService;
import com.bookapp.core.BookServiceImpl;
import java.util.List;
import java.util.Optional;
public class MainApplication {
public static void main(String[] args) {
BookService bookService = new BookServiceImpl();
// 创建测试数据
Book book1 = new Book("001", "Java编程思想", "Bruce Eckel", "978-7-111-54742-6", 108.0);
Book book2 = new Book("002", "Java核心技术", "Cay S. Horstmann", "978-7-111-54743-3", 128.0);
Book book3 = new Book("003", "Effective Java", "Joshua Bloch", "978-7-111-54744-0", 98.0);
// 添加书籍
System.out.println("\n=== 添加书籍 ===");
bookService.addBook(book1);
bookService.addBook(book2);
bookService.addBook(book3);
// 查询所有书籍
System.out.println("\n=== 查询所有书籍 ===");
List<Book> books = bookService.getAllBooks();
books.forEach(System.out::println);
// 按ID查询书籍
System.out.println("\n=== 按ID查询书籍 (ID: 002) ===");
Optional<Book> foundBook = bookService.findBookById("002");
foundBook.ifPresent(book -> System.out.println("找到书籍: " + book));
// 更新书籍
System.out.println("\n=== 更新书籍 (ID: 003) ===");
Book updatedBook = new Book("003", "Effective Java第3版", "Joshua Bloch", "978-7-111-54744-0", 118.0);
bookService.updateBook(updatedBook);
// 再次查询验证更新
System.out.println("\n=== 验证更新结果 ===");
bookService.findBookById("003").ifPresent(System.out::println);
// 删除书籍
System.out.println("\n=== 删除书籍 (ID: 001) ===");
bookService.deleteBook("001");
// 最终状态
System.out.println("\n=== 最终书籍列表 ===");
bookService.getAllBooks().forEach(System.out::println);
}
}
编译与运行
# 编译所有模块 javac -d out $(find src -name "*.java") # 运行应用程序 java --module-path out -m book.app/com.bookapp.main.MainApplication
模块依赖关系图
book.app --- requires ---> book.core
|
--- requires ---> book.api
--- requires ---> book.database
|
--- requires ---> book.api
依赖关系:
book.api → 无依赖
book.core → requires book.api, book.database
book.database → requires book.api
book.app → requires book.api, book.core
关键特点
- 强封装性: 每个模块只暴露需要的公共API
- 显式依赖: 通过
requires明确声明依赖 - 服务加载器: 使用
provides和uses实现依赖注入 - 模块隔离: 每个模块独立编译和打包
- 版本控制: 模块通过
module-info.java管理版本
这个案例展示了Java模块化系统的核心概念,包括模块定义、依赖管理和服务提供机制。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播