1 Star 0 Fork 1

TJU / infrastructure

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

infrastructure

介绍

Java开发基础架构:

  1. 国际化处理
  2. 通用异常捕获
  3. 多数据源连接(MyBatis- Plus)
  4. Shiro权鉴验证
  5. DDD框架(可选, 基于AXON)
  6. Partner(DDD示例应用)

Axon

mdb

mvc

软件架构

软件架构说明

安装教程

  1. mvn clean install -Pdelombok -DskipTests

使用说明

mdb -multiple datasource

1.需要配置多数据库源,示例如下:

mdb:
  databases:
    - item:
        password: password
        user: user
        url: jdbc:mysql://server:13306/databaseName
        type: com.mysql.cj.jdbc.MysqlDataSource
        driver: com.mysql.cj.jdbc.Driver
        max: 100
        idle: 100
      mapper: ''
      name: partner
  desc: partner

MyBatisPlus 配置

@Slf4j
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.yp.apps.partner.domain.mapper", sqlSessionTemplateRef  = "partnerSqlSessionTemplate")
public class PartnerDataSource {
}
国际化
  1. 实现IMessageSourceManager
  2. META-INF/services目录下创建SPI文件 com.yp.infrastructure.mvc.i18n.IMessageSourceProvider, 内容为接口的实现类

Shiro

  1. 配置JWT签名与默认过期时间(分钟)
security:
  secret: juxj.net
  expired: 10
DDD
  1. 聚合

@Aggregate
class PartnerAggregate constructor() : BaseAggregate() {

    val log: Logger = LoggerFactory.getLogger(PartnerAggregate::class.java)

    lateinit var code: String
    lateinit var name: String

    @AggregateMember
    var customers: MutableSet<String> = mutableSetOf()

    @AggregateMember
    var vendors: MutableSet<String> = mutableSetOf()


    @CommandHandler
    constructor(cmd: CreatePartnerCommand) : this() {
        val e = CreatePartnerEvent(cmd.code, cmd.name, cmd.owner, cmd.type)
        e.id = cmd.id
        AggregateLifecycle.apply(e)
    }


    @EventHandler
    fun on(e: CreatePartnerEvent) {
        log.debug("....")
        this.id = e.id
        this.code = e.code
        this.name = e.name
        when (e.type) {
            EnumPartnerType.CUSTOMER -> {
                if (customers.contains(e.owner)) throw PartnerException(EnumErrorMessage.CUSTOMER_EXISTS)
                customers.add(e.owner)
            }
            EnumPartnerType.VENDOR -> {
                if (customers.contains(e.owner)) throw PartnerException(EnumErrorMessage.VENDOR_EXISTS)
                vendors.add(e.owner)
            }
            else -> {
                throw PartnerException(EnumErrorMessage.UNKNOWN_PARTNER_TYPE)
            }
        }
    }

}


abstract class AbstractAxonHandler : AbstractHandler() {
    /**
     * 查询聚合实体
     * @param repository 聚合仓库
     * @param id 聚合id
     * @param e 空值是否异常, 默认(true),空值抛异常
     */
    @Throws(AggregateNotFoundException::class)
    protected inline fun <reified T : AxonAggregateRoot> getAxonAggregate(
        repository: EventSourcingRepository<T>,
        id: String,
        e: Boolean = true
    ): T {
        val aggregate = repository.load(id).wrappedAggregate.aggregateRoot
        if (null == aggregate && e) {
            logger.warn("聚合未找到: {}, type:{}", id, T::class.simpleName)
            throw AggregateNotFoundException("Aggregate Not found", id)
        }
        return aggregate
    }
}
  1. 命令
/**
 * 命令责职抽象类
 */
abstract class AbstractPartnerCommand(open val owner: String) : BaseAxonCommand() {
    constructor(id: String, owner: String) : this(owner) {
        this.id = id
    }
}

/**
 * 创建命令
 */
data class CreatePartnerCommand(
     val code: String,  val name: String, override val owner: String, val type: EnumPartnerType
) : AbstractPartnerCommand(owner)


/**
 * 更改状态
 */
data class ChangePartnerStatusCommand(
     val partnerId: String, override val owner: String,  val status: EnumAvailable, val type: EnumPartnerType
) : AbstractPartnerCommand(partnerId, owner)
  1. 事件
/**
 * Partner事件抽象类
 */
abstract class AbstractPartnerEvent(open val owner: String) : BaseAxonEvent() {
    constructor(id: String, owner: String) : this(owner) {
        this.id = id
    }
}

/**
 * 创建Partner
 */
data class CreatePartnerEvent(
    val code: String, val name: String, override val owner: String, val type: EnumPartnerType
) : AbstractPartnerEvent(owner)


/**
 * 更改Partner状态
 */
data class ChangePartnerStatusEvent(
    val partnerId: String, override val owner: String, val status: EnumAvailable, val type: EnumPartnerType
) : AbstractPartnerEvent(partnerId, owner)
  1. 查询
/**
 * 模糊查询
 */
data class QueryPartnerByName(val name: String, val type: EnumPartnerType) : BaseAxonQuery()
  1. EventHandler
    @LazyAutowired
    lateinit var partnerMapper: PartnerMapper

    @LazyAutowired
    lateinit var partnerTypeMapper: PartnerTypeMapper

    @LazyAutowired
    lateinit var partnerShipMapper: PartnerShipMapper

    /**
     * 处理创建Partner创建事件, 如写数据, 或进行其他发布新的事件, 供后续处理
     */
    @EventHandler
    fun on(e: CreatePartnerEvent) {
        log.debug("event  handler.")
    }
  1. QueryHandler
    /**
     * 事件库
     */
    @LazyAutowired
    lateinit var repository : EventSourcingRepository<PartnerAggregate>;
    
    /**
     * Mapper
     */
    @LazyAutowired
    lateinit var partnerMapper: PartnerMapper

    @LazyAutowired
    lateinit var partnerTypeMapper: PartnerTypeMapper

    @LazyAutowired
    lateinit var partnerShipMapper: PartnerShipMapper
    /**
     * 可以通过Mybatis+到数据库查(MySql), 也可以通过EventSourcing到事件库(Mongodb)查询
     */
    @QueryHandler
    fun on(q: QueryPartnerByName): List<PartnerVo>? {
        return emptyList()
    }

空文件

简介

Java开发基础架构: 1. 国际化处理(SPI) 2.通用异常捕获 3.多数据源连接(MyBatis- Plus) 4.Shrio权鉴验证 5.DDD框架(可选, 基于AXON) 展开 收起
Java 等 2 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/tjush/infrastructure.git
git@gitee.com:tjush/infrastructure.git
tjush
infrastructure
infrastructure
main

搜索帮助