服务模块 spring-context 扩展机制
平台 Java 服务有两套框架,分别是 SpringBoot 和 JarsLink , 两套框架底层都基于 SpringFramework 。 使用方式上存在一定差异。
SpringBoot
SpringBoot 应用结构
SpringBoot 应用模板中 main 模块是一个标准的 SpringBoot 应用 , 使用 Mybatis , Mybatis-Plus 访问数据库。使用 Maven 作为构建工具。
开发 SpringBoot 应用
源代码文件说明
project.xml newdao 平台服务项目配置文件
pom.xml Maven pom 文件
lib/ 私有依赖 jar 文件目录
.config/spring-boot/spring-boot-devtools.properties springboot 热加载配置文件
src/main/java 用户代码文件目录,
src/main/java/MainSpringBootApplication.java SpringBoot main 主类
src/main/gen-java 自动生成的代码目录,此目录下文件不能编辑,后续自动生成时会覆盖。
src/main/resource 配置文件目录
src/main/resource/application.yml springboot 应用配置文件,可编辑
src/main/resource/logback-spring.xml logback 日志配置文件,可编辑
依赖管理
添加公共依赖
公共依赖 jar 文件可以通过 Maven 仓库下载,直接在 pom.xml 文件中添加。
"auto generated start", "auto generated end" 注释之间的依赖是自动生成的依赖,后续生成代码会覆盖,手工添加的依赖应该在此注释块之外。
例如下面代码添加 jedis 依赖到应用
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.3</version>
</dependency>
<!-- auto generated start -->
<!-- auto generated end -->
</dependencies>
添加私有依赖
私有依赖 jar 文件不可通过 Maven 仓库下载, 将 jar 文件复制到 lib 目录, 然后点击浏览器中"服务"的编译按钮。或者执行本地 IDE eclipse 中的 compile 项目。 执行上述操作后, 系统会扫描到 lib 目录下的 jar 文件, 并生成 pom.xml 中的依赖定义, 并将 jar 文件安装到 Maven 本地仓库。
添加应用代码
利用 SpringBoot 默认扫描机制,在 src/main/java 目录下约定的 package 下添加代码及注解,自动扫描注册到 spring context
常见的应用应用代码及其 package
- controller main.controller
- service main.service
- mapper main.mapper
- entity main.entity
- vo main.vo
- config main.common.config
SpringBoot 热加载配置
在 IDE 容器, 本地 IDE 开发环境中, 应用通过 SpringBoot Maven 插件运行 "spring-boot:run",支持热加载。
".config/spring-boot/spring-boot-devtools.properties" 是 SpringBoot 热加载配置文件,具体配置项的使用请参考 官方文档。
定制 spring 系统配置
为了方便大多数的应用开发场景, 应用中的常用配置自动生成,代码在 "src/main/gen-java" 目录下,自动生成的配置包括 Datasource , Mybatis 配置等。
某些特殊情况下,可能需要定制这些自动生成的 bean,系统对此进行了支持,其基本原理如下。
- 查看 src/main/gen-java 下自动生成的代码,确定需要定制的 bean 名称及所属的类。
- 在 project.xml 中声明需要覆盖的 bean 名称,在此名称列表中的 bean ,其创建方法上的 spring 注解将会被注释,不再自动注册。
- 在定制的 config 类中使用依赖注入步骤1获得的系统配置类。
- 在定制的 config 类中创建相同名称的 bean,并使用系统配置类中自动生成的注解(可从系统配置类复制)
- 调用系统类的生成方法获得系统创建的 bean,调用其配置方法修改配置。
定制 Mybatis 配置 MybatisSqlSessionFactoryBean
- MybatisSqlSessionFactoryBean 在 src/main/gen-java 目录下 main.common.config 包中的 MainDatabaseConfig 类中创建,其名称与方法名相同: "sqlSessionFactory"
- project.xml 中添加如下配置:
<overrideBean>sqlSessionFactory</overrideBean>
- 在 src/main/java 目录下 main.common.config 包中添加 MyDBConfig 配置类,从系统生成的 MainDatabaseConfig 配置类中复制方法签名及方法注解,使用依赖注入 MainDatabaseConfig,调用 MainDatabaseConfig 方法创建 MybatisSqlSessionFactoryBean,修改 MybatisSqlSessionFactoryBean 配置
@Configuration(value="main-MyDBConfig")
public class MyDBConfig {
@Autowired
MainDatabaseConfig dbconf;
@Primary
@Order(value = 1)
@Bean(value="main-sqlSessionFactory")
public MybatisSqlSessionFactoryBean sqlSessionFactory(
@Qualifier("main-moduleDataSource") DruidDataSource dataSource,
ApplicationContext appCtx
) throws Exception {
MybatisSqlSessionFactoryBean ret = dbconf.sqlSessionFactory(dataSource, appCtx);
// 修改 MybatisSqlSessionFactoryBean 配置
return ret;
}
}
JarsLink
JarsLink 应用结构
JarsLink 应用和 SpringBoot 应用一样,使用 Mybatis, Nybaits-Plus 访问数据库 。 使用 Maven 作为构建工具。
JarsLink 应用运行机制和 SpringBoot 不同, SpringBoot 应用一般编译打包为一个可执行 jar 文件, 而 JarsLink 应用编译后的 jar 文件不能直接执行, 而是以 JarsLink 模块的形式, 运行在 Tomcat 中。
JarsLink 是 alibaba 开源的一套模块框架, JarsLink 每个应用模块都是一个 ApplicationContext , 和应用的主 ApplicationContext 构成父子关系。
Tomcat ROOT.war 集成了 JarsLink 模块系统,启动阶段会扫描注册所有的 JarsLink 模块并注册,开发阶段, IDE 容器或者 本地 IDE 开发环境下, JarsLink模块支持热加载,监控 target/classes 目录下的变化,自动刷新模块。
JarsLink模块扫描目录
/work/jarslink 云端 IDE 容器 JarsLink 模块目录,每个子目录是一个 JarsLink 模块
{本地ide安装目录}/work/jarslink 本地 IDE 开发环境中 JarsLink 模块目录, 每个子目录是一个 JarsLink 模块
开发 JarsLink 应用
源代码文件说明
project.xml newdao 平台服务项目配置文件
pom.xml Maven pom 文件
lib/ 私有依赖 jar 文件目录
src/main/java 用户代码文件目录,
src/main/gen-java 自动生成的代码目录,此目录下文件不能编辑,后续自动生成时会覆盖。
src/main/resource 配置文件目录
src/main/resource/main-spring-mybatis.xml Mybatis 配置文件,可编辑。
src/main/resource/META-INF/spring/springmvc-servlet.xml spring context 定义文件,不可编辑
依赖管理
添加公共依赖
公共依赖 jar 文件可以通过 Maven 仓库下载,直接在 pom.xml 文件中添加。
"auto generated start", "auto generated end" 注释之间的依赖是自动生成的依赖,后续生成代码会覆盖,手工添加的依赖应该在此注释块之外。
例如下面代码添加 jedis 依赖到应用
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.3</version>
</dependency>
<!-- auto generated start -->
<!-- auto generated end -->
</dependencies>
添加私有依赖
私有依赖 jar 文件不可通过 Maven 仓库下载, 将 jar文件复制到 lib目录, 然后点击浏览器中"服务"的编译按钮。或者执行本地 IDE eclipse 中的 compile 项目。 执行上述操作后, 系统会扫描到 lib 目录下的 jar 文件, 并生成 pom.xml 中的依赖定义, 并将 jar 文件安装到 Maven 本地仓库。
添加 Java 代码
利用 spring 默认扫描机制,在 src/main/java 目录下约定的 package 下添加代码及注解,自动扫描注册到 spring context
常见的应用应用代码及其 package
- controller main.controller
- service main.service
- mybatis mapper main.dao
- entity main.model
- vo main.vo
- config main.common.config
注意: JarsLink 模块中的 controller 其请求映射路径需要以模块名开始,例如当前模块是 "main" 那么 controller 中映射的的路径必须是 "/main/xxx"
添加 spring context xml 配置文件
在 src/main/resources/META-INF/spring 目录中可添加一个或者多个 spring context xml 配置文件,系统初始时会自动扫描并用于初始化 ApplicationContext
注意:"springmvc-servlet.xml" 这个文件由系统自动生成,用于自定义xml 文件不要与之重名,否则会被覆盖。 通过上述方法扩展 ApplicationContext 时,使用注解自动扫描加入的 java 类不要在 xml 中重复定义,否则会出现重复定义错误。
定制 spring 系统配置
为了方便大多数的应用开发场景, 应用中的常用配置自动生成,代码在 "src/main/gen-java" 目录下,自动生成的配置包括 Datasource , Mybatis 配置等。
某些特殊情况下,可能需要定制这些自动生成的bean,系统对此进行了支持,其基本原理如下。
- 查看 src/main/gen-java 下自动生成的代码,确定需要定制的 bean 名称及所属的类。
- 在 project.xml 中声明需要覆盖的 bean 名称,在此名称列表中的 bean ,其创建方法上的 spring 注解将会被注释,不再自动注册。
- 在定制的 config 类中使用依赖注入步骤1获得的系统配置类。
- 在定制的 config 类中创建相同名称的 bean,并使用系统配置类中自动生成的注解(可从系统配置类复制)
- 调用系统类的生成方法获得系统创建的 bean,调用其配置方法修改配置。
定制 Mybatis 配置 MybatisSqlSessionFactoryBean
- MybatisSqlSessionFactoryBean 在 src/main/gen-java 目录下 main.common.config 包中的 MainDatabaseConfig 类中创建,其名称与方法名相同: "sqlSessionFactory"
- project.xml 中添加如下配置:
<overrideBean>sqlSessionFactory</overrideBean>
- 在 src/main/java 目录下 main.common.config 包中添加 MyDBConfig 配置类,从系统生成的 MainDatabaseConfig 配置类中复制方法签名及方法注解,使用依赖注入 MainDatabaseConfig,调用 MainDatabaseConfig 方法创建 MybatisSqlSessionFactoryBean,修改 MybatisSqlSessionFactoryBean 配置
@Configuration(value="main-MyDBConfig")
public class MyDBConfig {
@Autowired
MainDatabaseConfig dbconf;
@Primary
@Order(value = 1)
@Bean(value="main-sqlSessionFactory")
public MybatisSqlSessionFactoryBean sqlSessionFactory(
@Qualifier("main-moduleDataSource") DruidDataSource dataSource,
ApplicationContext appCtx
) throws Exception {
MybatisSqlSessionFactoryBean ret = dbconf.sqlSessionFactory(dataSource, appCtx);
// 修改 MybatisSqlSessionFactoryBean 配置
return ret;
}
}