jad源码结构说明与项目配置详解

jad源码结构说明与项目配置详解

1           前言

       JAD项目自上线以来,倍受关注,然而很多初识这个项目的朋友看着这个项目的源代码觉得一脸懵逼,不知道配置在哪里,不知道从何下手。本文就从项目源码的结构入手,一步步揭开JAD项目的面纱,并带大家详细解读项目的配置。

2           源码结构说明

       对于传统的简单开源项目,只要下载项目源代码,编译后就可以直接使用,甚至还可以直接部署并运行。然而,JAD项目的源代码要直接编译使用的话,暂时还没有比较详细的使用手册等文档做支撑,庆幸的是JAD作者开发了一个比较灵活的eclipse插件,通过这个插件来帮助我们创建项目并部署运行(也可以不用插件创建项目,但需要开发人员自己配置,这要求开发人员对项目源码的结构很熟悉)。JAD之所以这么做,是因为JAD作者将这个项目定位在为程序员提供一个高效的自动化开发平台,它涉及互联网JAVA后台技术基础架构的方方面面。因为它涉及的技术范围比较大,不可能像jeesite或其它的小项目那样,下载源码就可以直接安装部署。举个例来说,jad项目持久化方面同时支持hibernate、mybatis、spring jpa,在缓存方面同时支持ehcache、memcache、redis,在权限认证方面即支持简单的认证也支持sso单点登陆,在发布部署方面即支持传统单体项目也支持分布式微服务,然而在实际项目的实施过程中,可能不需要这么多功能,比如有些项目只要hibernate、ehcache,有些项目只要mybatis,针对这么多不同的技术框架组合,需要开发人员自己选择性的配置(传统的项目往往只支持hibernate或mybatis,底层技术架构比较单一)。JAD项目的这种多技术方案多选择的机制,注定了JAD项目的源码不能像传统的项目那样,而是JAD源码结构跟用户最终使用的项目的源码结构一致,于是也就有了JeeadWizard这个Eclipse插件来帮助我们选择和配置。

    在JAD的源代码中,作者将hibernate、mybatis、和spring jpa模块组织到一起,形成jad的持久化模块(jad-dao),将ehcache、memcache、redis等缓存相关的模块组织到一起,组成jad的缓存模块(jad-cache),将dubbo服务调度管理与服务监控等模块组织到一起形成jad-dubbo模块,将sso、统一认证中心等模块组织到一起形成jad开放授权模块(jad-oauth)。同时,上述所有的持久化模块、缓存、开放授权等模块共同组成jad基础架构层模块(jad-infr)。

    在业务方面,JAD内置了sys权限模块、oa办工自动化模块、cms模块等等,这一系列的业务模块共同组成jad框架的核心业务层(jad-core),开发人员可以跟据的业务需求灵活选择自己想要的模块。也正是jad这种可灵活选择的特证,使得开发人员的项目干干净净,不需要的模块就不会出现在自己的代码中。比如,如果开发一个cms项目,在创建项目时不钩选oa模块,jad的oa模块就不会出现项目中的任何一个地方(它不会像jeesite那样,项目中即有oa又有cms方面的代码,即使oa模块的代码在某个项目永远用不到,但它一直会在开发人员需要维护的源代码里面)。

    可以说,整个jad项目就是由jad基础架构层和核心业务层两大模块构成,用户可以跟据需要自己选择基础架构层中的技术选型,以及核心业务层中的业务模块。在末来,基础架构层以后还会引进消息中间件,定时调度等常用的功能模块。在核心业务层上,还会继续完善微信接口并引入支付模块实现多渠道支付网关等业务功能。

3           项目配置详解

    针对一些开发人员提出,找不到项目配置文件的情况,本人在这里给出详细的说明。

    JAD项目是以maven的方式组织起来的,遵循maven项目结构的基本规范:项目之间的依赖及第三方jar包都在项目跟目录中的pom.xml中配置。几乎所有的业务配置都在项目的src/main/resources目录下(java源代码都在src/main/java目录下),在项目打包发布的过程中src/main/resources目录下的所有文件会自动打包到应用部署的classpath中。知道了配置文件的位置,那么jad项目中到些有些什么配置?这些配置又如何解读呢?

    因为jad源码并不能直接部署运行,而是需要自己创建项目(可以用eclipse插件创建,也可以手工创建后再自己去配置)后再部署运行,所以直接查看jad源代码每个模块的src/main/resources目录中的配置是没有意义的,而且手工创建项目自己配置依赖的话,是比较复杂的,本文暂时先跳过手工配置的方式,而从JeeadWizard插件创建项目的方式入手,带大家读读通过这个插件创建出来的项目会是什么样子的。

    JeeadWizard插件创建项目时有两种选择,一种是创建传统的单体项目,一种是可分布式部署的微服务架构。现在先从简单项目的结构和配置讲起:

3.1       jad简单项目的结构和配置

    jad创建的简单项目是一个maven结构的传统的java web项目。本项目下分api、controller、core、web四个模块。

3.1.1        api模块

    其中api模块是最基础的模块,它包含了这个项目的接口声明(本质上是service的接口,及参数、返回值声明等),但没有业务实现。

    通过查看这个模块的pom.xml配置,可以看到,它依赖了jad-cache-api, jad-sys-api等jad内置的api模块。

3.1.2        core模块

    core模块是项目业务实现层模块,对api模块中的接口进行了业务实现(本质上是service的实现类所在的模块,在业务实现的过程中可能需要对数据库进行增删改查之类的访问,所以这个模块口还有dao接口和实现类相关代码)。

    通过查看这个模块的pom.xml配置,可以看到,它依赖了api模块及jad-dao相关模块。同时,因为这是一个传统的单体项目,所有的业务模块的现实都耦合在一起,所以在这个模块的pom.xml中,还可以看到,它还依赖了jad-sys-core、jad-cms-core、jad-oa-core等jad内置的业务实现模块(如果是微服务架构,就不会依赖这些,它们是相互独立部署的)。

3.1.3        controller模块

       jad项目的前端是基于spring mvc的,所有的controller类就在这个模块中。因为这是一个传统的单体项目,它直接依赖了core模块,将核心业务实现依赖了进来(但是在微服务架构中,它仅仅依赖没有业务实现的api模块,不会依赖core模块,对core模块的依赖放在放在服务提供者模块中)。

       以上api、core、controller三个模块的src/main/resources目录几乎都是空的,没有什么配置。jad简单项目的配置都在web模块的src/main/resources目录中,以下介绍web模块。

3.1.4        web模块

              web模块是一个web项目,可以直接打成war包并部署到tomcat等web项目。这个模块几乎没有java类代码,而只包含一些配置及jsp等页面文件,在pom.xml文件中,可以看到,他主要依赖了controller模块(在spring mvc中controller充当控制器C,而本web模块的一些jsp等文件就是视图V)。

       本模块除了jsp等页面文件外,最重要的配置也都在这个模块,在它的src/main/resources目录下可以看到缓存、springconext、数据库、日志等配置都在这里。下面通过web.xml入手,介绍这里的配置。

    做过java web开发的人都知道,java web项目中web.xml是最基本的配置,项目中所有的配置都就是从这里组织起来的。

    在jad简单项目的web.xml中,除了一些基本的servlet外,有两个比较重要的配置,那就是

  contextConfigLocation

classpath:/spring/spring-context.xml

 

com.test.web.listener.JadContextListener

 

和spring mvc相关的servlet配置。同大部分spring mvc的项目一样,jad简单项目在系统初始化的过程中,会加载两个srping上下文,其中第一个上下文就是上述配置的com.test.web.listener.JadContextListener监听器来加载的跟上下文,它对应的配置文件就是上述配置的contextConfigLocation参数指定的/spring/spring-context.xml文件。而另一个上下文就是spring mvc相关的servlet配置中初始化的上下文,对应的配置文件是/spring/spring-mvc.xml。

   综上所述,整个配置jad简单项目的配置入口是/spring/spring-context.xml和/spring/spring-mvc.xml这两个文件。其中第二个文件是spring mvc相关的配置,对spring mvc了解的开发人员应该比较熟悉,这里不细说,但值得一提的是,jad项目集成了swagger,通过它可以将所有controller类的相关方法生成对像的api文档,在spring-mvc.xml文件中就可以看到相关的配置。最后,我看看spring-context.xml文件的内容,在这个文件里,通过加载了jad.properties配置文件。通过context:component-scan节点声明了要扫描了的bean。在这个文档的最后,通过以下几行

 

 

分别引进shiro,数据源、ehcache、mybatis等配置,具体内容看文件名就可以猜到大至是什么配置,这里不细说,值得一提的是,这里import的文件不是固定的,用JeeadWizard插件在创建项目的过程中,插件会跟据你所选择的技术选型自动帮你import相关的配置文件,比如如果你用mybatis数据持久化框架,这里就引入context-mybatis.xml文件,如果你用hibernate ,这里就引入 context-hibernate.xml。当然,这里也不是一成不变,开发人员也可以手工修改这里,比如,项目原来用的是mybatis,现在突然想改成hibernate,只需要把这里的context-mybatis.xml改为context-hibernate.xml(context-mybatis.xml和context-hibernate.xml这些文件都可以在jad/jad-gen/jad-gen-conf模块中找到,开发人员只需要把它们复制出来放到自己的项目里即可),当然,在手工修改时别忘了还要在pom.xml中修改对应的依赖(比如把context-mybatis.xml改为context-hibernate.xml时,需要在pom.xml中去掉mybatis相关的依赖然后加上hibernate相关的依赖)。

3.2       jad微服务项目的结构和配置

通过JeeadWizard创建的微服务项目结构如下图:

jad源码结构说明与项目配置详解_第1张图片

图:微服务项目结构

   其中api、controller、core三个模块,同前述的简单项目中的结构其本一致,这里不细说,但值得一提的是,通过pom.xml中可以看到,这里的controller模块并不没有依赖任何core模块,因为在微服务架构的项目中,controller模块主要起api网关的作用,即然只是一个网关,就不应该有任何业务实现,所以它依赖了api模块。而对core模块的依赖,是放在服务者provider中的。下面介绍服务提供者模块。

3.2.1        provider模块

   要看懂provider配置的具体内容,需要对dubbo框架所有了解。

   provider模块是本项目的服务提供者模块,它主要依整了core模块,并通过dubbo把业务接口暴露成服务并发布到注册中心供服务消费者调用。

   dubbo服务是支持分布式部署的,jad中的所有业务模块都是松耦合而且独立部署的,所以在jad生成的项目中provider模块下面分了好几个子模块。几乎每个子模块都是可以独立运行和监控的。

   目前在jad内置的业务服务提供中,主要有provider-sys(权限服务)、provider-oa(oa服务)等等,每个子模块的结构都类似,它们共同依赖provider-conf(服务配置)模块,服务配置模块主要包括数据库、缓存等通用配置(当然,这个模块仅仅是为了简化每个模块都需要的配置而抽取出来的通用配置,服务提供模块也可以不依赖这个模块,而自己另外配置数据库、缓存等信息)。现以provider-sys为例,给大家解读服务提供者配置:

   在provider-sys模块的pom.xml中可以看到,它主要依赖了conf配置模块有jad-sys-core模块,从这里可以大胆猜测到它将sys模块(系统权限模块)的接口实现通过dubbo暴露成了dubbo服务(实事上也是如此)。 pom.xml中还有一段跟assembly相关的plugs配置,这个主要是用给服务提供者程序打包的,在这个模块被maven install时,assembly就会自动打包成生包含项目代码和start.sh,stop.sh等启停命令脚本的安装包,方便部署和运行在生产环境上(jad的服务提供者不需要任何tomcat之类的web容器就可以直接通过start.sh调起main函数直接跑起来,这也是dubbo官方所推荐的方式)。 对dubbo熟悉的人都知道,服务提供者中最重要的配置文件就是dubbo.properties文件了,在jad的服务提供者模块中的dubbo.properties文件中,需要了解的有几下三行配置:

dubbo.container=spring

dubbo.spring.config=classpath*:spring-context.xml

dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo.registry.port=20881

从以上配置可以看到,服务提供者在启动的过程中,会跟据spring-context.xml初始化一个spring容器,通过这个spring container将所有service暴露成服务并注册到本地的zookeeper注册中心中,并在20881端口上开启监听。

   对于spring-context.xml配置的内容,大部分同前述的jad简单项目中的同名文件配置类同,不再详述,但它跟简单项目中的配置唯一不同的是增加了一行配置,这一行配置就是跟dubbo相关的配置了。这个context-provider.xml文件,配置了dubbo相关的注册中心、监控中心、等等,此外,在provider-sys模块的的context-provider.xml文件中,它还通过一行引入sys模块的服务配置。打开文件provider-sys.xml可以看到,这个文件通过一系列的dubbo:service节点sys模块的业务接口暴露成了一个个dubbo服务(如果开发了一个业务接口,想暴露成dubbo服务的话,只需要在这里加一行配置)。

   以上就是服务提供者的配置了,对于它的打包部署及运行,请参见其它相关文档(比如《项目创建与部署测试》一文)。下在介绍服务消费者模块的结构及配置。

3.2.2        web模块

jad微服务架构中的web模块同jad简单项目中的web一样,都是一个普通的web项目,可以直接部署到tomcate之类的web服务器上运行。不同的是,jad微服务架构中的web模块从本质上是一个服务消费者,他自己实现任何业务,而是通过消费服务来完成业务请求。下面解读它的配置。

    web模块只依赖controller模块(但jad微服务架构的controller模块没有依赖core模块,所以此web模块没有任何业务实现,所以它收到业务请求后,需要调用服务提供者暴露的服务来完成请求。)

    从web.xml中可以看出,同前文简单项目上的web模块一样,它是一个典型的spring mvc项目,加载了两个上下文,对应的配置文件是spring-context.xml和spring-mvc.xml。其中spring-context.xml配置跟前文简单项目介绍的spring-context.xml文件类型,但是不同的地方在于本模块的spring-context.xml文件没有import任何跟数据库相关的配置(因为它没有业务实现,压根就不需要连数据库),只不过它通过一行配置,引入了context-consumer.xml文件,故名思意,这个文件就是服务消费者方面的配置了,打开这个文件可以看到,这个文件中除了配置了服务注册中心、监控中心等基本配置之外,又引入了等业务相关的服务消费配置。从这里可以看出,如果开始人员需要在服务消费者模块中消费一个服务,只需要在你自己的consumer-XXX.xml文件中加入一行跟consumer-sys.xml文件中类似的配置。

    以上就是jad微服务架构的项目全部的配置了,从以上配置中可以看出,如果开发人员开发了一个服务(即在api模块中写了一个service接口,在core模块中写了一个这个接口的实现类),需要在数服务提供方暴露报务时,只需要在你自己的provider-XXX模块的provider-XXX.xml配置文件中加入一行类似于是provider-sys.xml中的配置。如果要在服务消费方消费这个服务时,只需要在你的web模块的consumer-XXX.xml文件中加入一行跟consumer-sys.xml文件中类似的配置即可(强大的JeeadWizard插件在创建微服务架构的项目时,自动帮你将一切都配置好了,开发人员仅仅需要在相应的模块的provider-XXX.xml和consumer-XXX.xml是暴露和消费服务即可)。

    以上就是jad源码结构与项目配置相关内容,想了解本项目的更多动态信息,可以关注本人微信公众号:

jad源码结构说明与项目配置详解_第2张图片

 

转载于:https://my.oschina.net/u/1415710/blog/1212756

你可能感兴趣的:(jad源码结构说明与项目配置详解)