总结出一套自己熟悉,常用的框架体系。容易上手。
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笔记》作为构建工具。
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>1.4.2.Finalversion>
path>
<path>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.16version>
path>
<path>
<groupId>org.projectlombokgroupId>
<artifactId>lombok-mapstruct-bindingartifactId>
<version>0.2.0version>
path>
annotationProcessorPaths>
configuration>
plugin>
jar名 | 作用 |
---|---|
mapstruct mapstruct-processor |
pojo对象自动转换工具 |
lombok | pojo对象自动化工具 |
mybatis-generator-core | ORM自动化 |
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.16version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstructartifactId>
<version>1.4.2.Finalversion>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>1.4.2.Finalversion>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.4.0version>
dependency>
spring-boot是spring官方提供一系统J2EE组件的集成方案。使用了SPI思想构建的《spring boot启动流程》。下面介绍基于spring-boot:2.1.6.RELEASE项目中的各starter。.
spring boot的核心。提供starter功能
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<exclusions>
<exclusion>
<groupId>org.yamlgroupId>
<artifactId>snakeyamlartifactId>
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 |
使用slf4j统一第三方日志框架。与spring内部日志spring-jcl配合即统一项目。另外结合spring-boot进行配置。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-to-slf4jartifactId>
exclusion>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>jul-to-slf4jartifactId>
exclusion>
exclusions>
dependency>
jar名 | 作用 |
---|---|
logback-classic logback-core slf4j-api |
日志框架 |
spring.factories文件中的LoggingApplicationListener。
// LoggingApplicationListener监听的事务,监听spring期间,主要实现
// 1. 创建LoggingSystem,确定log实现类
// 2. 加载配置,对应logging.config的配置文件
// 3. 销毁,容器结束时销毁。
class LoggingApplicationListener{
}
jetty内置容器,提供servlet规范。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jettyartifactId>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.websocketgroupId>
<artifactId>*artifactId>
exclusion>
<exclusion>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-continuationartifactId>
exclusion>
<exclusion>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-servletsartifactId>
exclusion>
<exclusion>
<groupId>org.mortbay.jaspergroupId>
<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扩展功能 |
关注《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
借助servlet规范对接容器,并实现mvc模式。《spring-boot集成web篇-Web集成》
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
<exclusion>
<groupId>org.hibernate.validatorgroupId>
<artifactId>*artifactId>
exclusion>
exclusions>
dependency>
jar名 | 作用 |
---|---|
spring-mvc | mvc模式 |
spring-boot-starter-json | web json序列化包 |
通过上述介绍,成功的加载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);
}
提供web json序列化功能。《spring-boot集成web篇-Json集成》
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jsonartifactId>
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 |
通过上述介绍,成功的通过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;
}
主要负责数据库jdbc操作《spring-tx 事务》。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.13version>
dependency>
jar名 | 作用 |
---|---|
spring-tx spring-jdbc |
spring事务 spring-jdbc操作 |
mysql-connector-java protobuf-java |
连接mysql |
spring-boot-starter | spring-boot核心starter |
spring.factories文件中的DataSourceAutoConfiguration,DataSourceTransactionManagerAutoConfiguration。
// 通过DataSourceProperties加载配置文件中dataSource属性
// 通过Import DataSourceConfiguration.Hikari 初始 化HikariDataSource
// 注意 ConfigurationProperties注解的即用
public class DataSourceAutoConfiguration {
}
// 传入dataSource创建DataSourceTransactionManager
public class DataSourceTransactionManagerAutoConfiguration{
}
ORM框架集成。《Mybatis概述》
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.4version>
dependency>
jar名 | 作用 |
---|---|
mybatis | 持久层ORM |
mybatis-spring | 数据源&事务桥接包 |
mybatis-spring-boot-autoconfigure | 自动配置包 |
spring-boot-starter | spring-boot核心starter |
spring-boot-starter-jdbc | 基本数据库操作 |
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-test测试集成》
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<exclusions>
<exclusion>
<groupId>org.hamcrestgroupId>
<artifactId>hamcrest-libraryartifactId>
exclusion>
<exclusion>
<groupId>org.assertjgroupId>
<artifactId>*artifactId>
exclusion>
<exclusion>
<groupId>org.xmlunitgroupId>
<artifactId>*artifactId>
exclusion>
<exclusion>
<groupId>org.skyscreamergroupId>
<artifactId>*artifactId>
exclusion>
<exclusion>
<groupId>com.jayway.jsonpathgroupId>
<artifactId>*artifactId>
exclusion>
<exclusion>
<groupId>org.mockitogroupId>
<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:《基础项目结构一》