基础项目结构(一)

前言

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

技术依赖包

jar作用参考文章
logback-classic
logback-core
slf4j-api
日志框架日志框架
mysql-connector-java连接mysqlMySQL 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持久层ORMMybatis概述
mybatis-generator-coreORM自动化MyBatis Generator简介
spring-corespring核心工具类asm-cglib技术
spring-jclspring日志集成包spring-jcl日志集成
spring-beansspring容器spring-beans核心容器
spring-aopspring切面spring-aop 扩展代理
spring-expressionspring表达式spring-expression表达式
spring-contextspring上下文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对象自动转换工具
lombokpojo对象自动化工具

构建工具

主要依赖《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对象自动转换工具
lombokpojo对象自动化工具
mybatis-generator-coreORM自动化
<!-- 提供给编译器生成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-apij2ee注解规范
spring-corespring核心工具类
spring-jclspring日志集成包
spring-beansspring容器
spring-aopspring切面
spring-expressionspring表达式
spring-contextspring上下文
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流程

  1. JettyEmbeddedWebAppContext 对应 ServletContextHandler
  2. 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-mvcmvc模式
spring-boot-starter-jsonweb 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-webspring - web功能集成包
spring-boot-starterspring-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-starterspring-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-starterspring-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-starterspring-boot核心starter
集成测试

通过SpringBootTest注解所继承spring-test中的BootstrapWith注解实现

实现用例

请参考github:《基础项目结构一

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值