基础项目结构(一)

前言

总结出一套自己熟悉,常用的框架体系。容易上手。

技术依赖包

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-boot是spring官方提供一系统J2EE组件的集成方案。使用了SPI思想构建的《spring boot启动流程》。下面介绍基于spring-boot:2.1.6.RELEASE项目中的各starter。.

spring-boot-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

spring-boot-starter-logging

使用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{
}

spring-boot-starter-jetty

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扩展功能
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流程

  1. JettyEmbeddedWebAppContext 对应 ServletContextHandler
  2. ServletContextInitializer 对应 loadDispatcherServlet

spring-boot-starter-web

借助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序列化包
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.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
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.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
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.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 基本数据库操作
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.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:《基础项目结构一》

你可能感兴趣的:(架构&实战理解,基础实战)