前言
总结出一套自己熟悉,常用的框架体系。容易上手。
技术依赖包
jar | 作用 | 参考文章 |
---|---|---|
logback-classic logback-core slf4j-api | 日志框架 | 《日志框架》 |
mysql-connector-java | 连接mysql | 《MySQL Connector/J 8.0》 |
aspectjweaver | 字节码编入技术 | 《浅谈AOP》 |
HikariCP | 数据库连接池 | 《HikariCP连接池》 |
junit hamcrest | 单元测试框架 | 《Junit概述》 |
servlet-api jetty-http jetty-io jetty-security jetty-server jetty-servlet jetty-util | Web容器 | 《Jetty概述》 |
mybatis | 持久层ORM | 《Mybatis概述》 |
mybatis-generator-core | ORM自动化 | 《MyBatis Generator简介》 |
spring-core | spring核心工具类 | 《asm-cglib技术》 |
spring-jcl | spring日志集成包 | 《spring-jcl日志集成》 |
spring-beans | spring容器 | 《spring-beans核心容器》 |
spring-aop | spring切面 | 《spring-aop 扩展代理》 |
spring-expression | spring表达式 | 《spring-expression表达式》 |
spring-context | spring上下文 | 《spring-context 容器上下文》 |
spring-tx spring-jdbc | spring事务 spring-jdbc操作 | 《spring-tx事务》 |
spring-web spring-mvc | web框架集成 mvc模式 | 《spring-web 网络开发》 |
spring-test | 测试集成 | 《spring-test 测试集成》 |
jackson-annotations jackson-core jackson-databind | json解析工具 | 《JackSon概述》 |
mapstruct mapstruct-processor | pojo对象自动转换工具 | |
lombok | pojo对象自动化工具 |
构建工具
主要依赖《maven笔记》作为构建工具。
主要依赖插件
<!-- maven编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<!-- maven编译插件扩展模块 -->
<annotationProcessorPaths>
<!-- mapstruct 编译时自动生成 -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
<!-- lombok 编译时自动生成 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<!-- lombok-mapstruct 编译时冲突解决 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
工具辅助包
jar名 | 作用 |
---|---|
mapstruct mapstruct-processor | pojo对象自动转换工具 |
lombok | pojo对象自动化工具 |
mybatis-generator-core | ORM自动化 |
<!-- 提供给编译器生成class-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<!-- 提供class关系加载-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- 提供给编译器生成class用-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
spring-boot集成
spring-boot是spring官方提供一系统J2EE组件的集成方案。使用了SPI思想构建的《spring boot启动流程》。下面介绍基于spring-boot:2.1.6.RELEASE项目中的各starter。.
spring-boot-starter
spring boot的核心。提供starter功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 去掉yaml配置文件的依赖包 -->
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
spring-boot | 主要扩展context |
spring-boot-autoconfigure | 提供各种starter配置 |
javax.annotation-api | j2ee注解规范 |
spring-core | spring核心工具类 |
spring-jcl | spring日志集成包 |
spring-beans | spring容器 |
spring-aop | spring切面 |
spring-expression | spring表达式 |
spring-context | spring上下文 |
spring-boot-starter-logging | 日志starter |
spring-boot-starter-logging
使用slf4j统一第三方日志框架。与spring内部日志spring-jcl配合即统一项目。另外结合spring-boot进行配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<!-- 去log4j转sl4j的包 -->
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
<!-- 去java原生日志转sl4j的包-->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
logback-classic logback-core slf4j-api | 日志框架 |
日志与容器集成
spring.factories文件中的LoggingApplicationListener。
// LoggingApplicationListener监听的事务,监听spring期间,主要实现
// 1. 创建LoggingSystem,确定log实现类
// 2. 加载配置,对应logging.config的配置文件
// 3. 销毁,容器结束时销毁。
class LoggingApplicationListener{
}
spring-boot-starter-jetty
jetty内置容器,提供servlet规范。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<exclusions>
<!-- 去掉默认的jetty中websocket -->
<exclusion>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>*</artifactId>
</exclusion>
<!-- 去掉jetty中不用的功能 -->
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-continuation</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jasper</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
servlet-api jetty-http jetty-io jetty-security jetty-server jetty-servlet jetty-util | Web serlet容器 |
jetty-webapp jetty-xml | Webapp扩展功能 |
Jetty容器集成
关注《spring boot启动流程》中的几个方法
// 根据classpath下面所拥有的包来创建窗口
// sevlet 对应的是 AnnotationConfigServletWebServerApplicationContext
// Spring-FactoriesLoader功能加载spring.factories,扫描其中相关类
ConfigurableApplicationContext createApplicationContext();
// 最终会调用 AnnotationConfigServletWebServerApplicationContext.refresh
void refreshContext(ConfigurableApplicationContext context);
// 路径:ServletWebServerApplicationContext.createWebServer
// 得到 spring.factories中的
// 1. ServletWebServerFactoryAutoConfiguration
// 2. ServletWebServerFactoryConfiguration.EmbeddedJetty
// 3. JettyServletWebServerFactory
// 通过JettyServletWebServerFactory.getWebServer创建JettyServer
void createWebServer()
// 路径:JettyServletWebServerFactory.getWebServer
// 1. 创建Server
// 2. configureWebAppContext 配置容器参数
// 3. configureWebAppContext 通过ServletContextInitializer 配置servlet
// 4. 将JettyEmbeddedWebAppContext 设置到jetty hadler中
WebServer getWebServer(ServletContextInitializer... initializers)
参考《spring-web 网络开发》中的整合jetty流程
- JettyEmbeddedWebAppContext 对应 ServletContextHandler
- ServletContextInitializer 对应 loadDispatcherServlet
spring-boot-starter-web
借助servlet规范对接容器,并实现mvc模式。《spring-boot集成web篇-Web集成》
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 去掉默认的tomcat容器 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<!-- 去参数检验框架 -->
<exclusion>
<groupId>org.hibernate.validator</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
spring-mvc | mvc模式 |
spring-boot-starter-json | web json序列化包 |
WEB集成
通过上述介绍,成功的加载DispatcherServlet。根据《Servlet规范》知道,当容器启动完后,会初始化Servlet.
// DispatcherServlet初始化最终调用,
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
// 主要加载spring容器中提供组件
// 根据 spring.factories中
// 1. WebMvcAutoConfiguration
// 2. WebMvcAutoConfiguration.EnableWebMvcConfiguration
// 3. WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
spring-boot-starter-json
提供web json序列化功能。《spring-boot集成web篇-Json集成》
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
jackson-annotations jackson-core jackson-databind | json解析工具 |
jackson-datatype-jdk8 | 支持jdk8中的类型转换 |
jackson-datatype-jsr310 | 时间类型转换规范 |
jackson-module-parameter-names | 无注释的构造功能 |
spring-web | spring - web功能集成包 |
spring-boot-starter | spring-boot核心starter |
Json集成
通过上述介绍,成功的通过initHandlerAdapters,加载了RequestMappingHandlerAdapter。
// RequestMappingHandlerAdapter需要设置MessageConverters
// 通过WebMvcConfigurationSupport##getMessageConverters
protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<>();
// 1. 调用DelegatingWebMvcConfiguration##configureMessageConverters
// 2. DelegatingWebMvcConfiguration通过setConfigurers方法,将WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter注入
// 3. 最后通过ObjectProvider的方式获取容器中的HttpMessageConverters
// 4. 根据 spring.factories中 HttpMessageConvertersAutoConfiguration
configureMessageConverters(this.messageConverters);
//如果为空,则自己根据路径下的jar加载默认的
if (this.messageConverters.isEmpty()) {
addDefaultHttpMessageConverters(this.messageConverters);
}
// 修改messageConverters配置的扩展接口
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}
spring-boot-starter-jdbc
主要负责数据库jdbc操作《spring-tx 事务》。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
spring-tx spring-jdbc | spring事务 spring-jdbc操作 |
mysql-connector-java protobuf-java | 连接mysql |
spring-boot-starter | spring-boot核心starter |
Jdbc集成
spring.factories文件中的DataSourceAutoConfiguration,DataSourceTransactionManagerAutoConfiguration。
// 通过DataSourceProperties加载配置文件中dataSource属性
// 通过Import DataSourceConfiguration.Hikari 初始 化HikariDataSource
// 注意 ConfigurationProperties注解的即用
public class DataSourceAutoConfiguration {
}
// 传入dataSource创建DataSourceTransactionManager
public class DataSourceTransactionManagerAutoConfiguration{
}
mybatis-spring-boot-starter
ORM框架集成。《Mybatis概述》
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
mybatis | 持久层ORM |
mybatis-spring | 数据源&事务桥接包 |
mybatis-spring-boot-autoconfigure | 自动配置包 |
spring-boot-starter | spring-boot核心starter |
spring-boot-starter-jdbc | 基本数据库操作 |
ORM集成
mybatis引入了自己的autoconfigure。其中主要关注MybatisAutoConfiguration。
// 通过扫描配置Mybatis
// 完成SqlSessionFactory的初始化
// 1. SqlSessionFactory中datasource直接从容器中引入
// 2. SqlSessionFactory中事务则使用SpringManagedTransactionFactory
// 3. SpringManagedTransactionFactory 创建的SpringManagedTransaction最终使用 jdbc包中的DataSourceUtils
class MybatisAutoConfiguration{
// 通过MapperScannerConfigurer扫描@Mapper注解接口
// 将扫到的接口包装进MapperFactoryBean
// MapperFactoryBean利用spring FactoryBean特性注入到mybatis容器,及获取
@org.springframework.context.annotation.Configuration
@Import(AutoConfiguredMapperScannerRegistrar.class)
@ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })
public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {
@Override
public void afterPropertiesSet() {
logger.debug(
"Not found configuration for registering mapper bean using @MapperScan, MapperFactoryBean and MapperScannerConfigurer.");
}
}
}
spring-boot-starter-test
集成测试框架接入。《spring-test测试集成》
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
</exclusion>
<exclusion>
<groupId>org.assertj</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.xmlunit</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.skyscreamer</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖包说明
jar名 | 作用 |
---|---|
junit hamcrest | 单元测试框架 |
spring-test | 测试框架容器集成 |
spring-boot-test | 扩展contex,提供mock等接入方式 |
spring-boot-test-autoconfigure | 自动配置包,测试相关组件 |
spring-boot-starter | spring-boot核心starter |
集成测试
通过SpringBootTest注解所继承spring-test中的BootstrapWith注解实现
实现用例
请参考github:《基础项目结构一》