最佳实践:如何为 spring 个 java 项目实现插件?

Best practise: How to implement plugins for spring jpa projects?

我一直想知道为 spring jpa 项目实现插件的最佳实践是什么。

例如,我会有这样的 java 项目结构:

服务器核心

@Entity
public class User {

    private String name;
    
}

现在我想要单独的 java 项目作为服务器项目的插件。

第一个插件

第一个插件应该向用户实体添加另一个字段,例如 users age

第二插件

第二个插件应该添加一个新的 table 和一个从新的 table 到用户 table 的关系,例如:

@Entity
public class Usergroup {
    
    private Set<User> users;
    
}

现在我的问题

使用的数据库是sql服务器。有没有什么好的做法可以在不对服务器核心项目进行更改的情况下实现此类插件,以便始终可以附加和解耦插件而不影响服务器核心项目? sql 服务器是这种架构的正确数据库还是我应该使用非 sql 数据库?

如果您不希望插件 link/include 原始项目的二进制文件,您可以将原始项目标记为 provided (maven) 或 compileOnly (gradle) 依赖关系:

<groupId>your.group.id</groupId>
<artifactId>server-core</artifactId>
<version>your-core-version</version>
<scope>provided</scope>
compileOnly your.group.id:server-core:your-core-version

将此添加到插件的构建配置意味着 server-core 在编译插件时可用,但不会包含在二进制文件中(如 fat JAR)。

如果您担心某个插件会破坏您的数据库并且删除该插件时它无法正常工作,则由该插件负责。

如果您想创建在删除插件时执行的自定义登录,您可以为此添加一个 API(例如,插件可以包含具有特定名称的 sql 脚本,这些脚本已保存当插件加载时,如果程序在没有插件的情况下启动,将被执行。

但是,无论如何,插件不应更改您的核心数据结构或向核心依赖项使用的现有表添加约束。

相反,插件应该访问其他表以便在那里添加自己的数据。

使用 NoSQL 数据库也能正常工作。例如,您可以使用像 MongoDB 这样的文档存储数据库。如果这样做,插件可以轻松添加内容而不会干扰核心项目。如果之后删除插件,数据可以保留而不会干扰核心项目。如果您使用 SQL 数据库,我建议您不要对核心项目和插件项目使用相同的表。 IYou may event want to use a different schema for every plugin.