基于Spring源码工程创建练习模块,集成lombok,为后续Spring核心API的学习做铺垫。
创建子模块
项目右键:New | Module,创建一个gradle子模块examples,以它为父路径,再创建练习的模块spring-00-demo-without-spring,注意,模块以spring-开头,build.gradle主配置中会对这类模块进行统一的设置,为确保模块使用的环境一致,我们遵循这个约定。
![](https://i-blog.csdnimg.cn/blog_migrate/47ef76cf94e7cdd090c21698697b209e.png)
模块结构:
![](https://i-blog.csdnimg.cn/blog_migrate/68d52123d7ce1b021e0b5a8f9d595906.png)
settings.gradle中包含进来的模块:
include 'examples'
include 'examples:spring-00-demo-without-spring'
引入lombok
在工程build.gradle中维护新加的依赖版本,这里引入lombok来简化开发
configure(allprojects) { project ->
...
dependencyManagement {
...
dependencies {
dependency "org.projectlombok:lombok:1.18.24"
...
}
}
}
在公共依赖中引入lombok组件编译需要的依赖
configure([rootProject] + javaProjects) { project ->
...
dependencies {
compile 'org.slf4j:slf4j-api'
compileOnly 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
...
}
}
我们希望使用lombok提供的日志注解来简化日志api的使用,引入进来会有副作用,编译源码时会提示注解处理器报出来警告信息:
警告: 没有处理程序要使用以下任何注释: org.springframework.core.annotation.AliasFor,javax.annotation.meta.TypeQualifierDefault,org.springframework.lang.NonNullFields,java.lang.FunctionalInterface,org.springframework.lang.NonNullApi,javax.annotation.meta.TypeQualifierNickname,org.springframework.lang.Nullable,javax.annotation.Nonnull
错误: 发现警告, 但指定了 -Werror
1 个错误
1 个警告
按照提示来解决,在CompilerConventionsPlugin类中注释掉,
// , "-Werror"
并在spring-beans.gradle中注释掉:
compileGroovy {
...
// options.compilerArgs += "-Werror"
}
引入现有的Spring模块
因为我们的练习模块集成在Spring源码工程中,引入Spring模块采用如下的形式:
spring-00-demo-without-spring/build.gradle
dependencies {
compile(project(":spring-beans"))
}
日志配置文件
从Spring模块中拷贝一份单元测试环境使用的日志配置文件,放到我们练习模块相应的test/resources目录下
![](https://i-blog.csdnimg.cn/blog_migrate/dacff2b8902e37b0b43fd8c071be633a.png)
修改日志级别,确保所有info级别的日志能正常输出,方便跟踪执行步骤。另外设置为不同的日志级别采用不同颜色的高亮显示:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{1.} - %msg%n}"
disableAnsi="false" noConsoleNoAnsi="false" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.xiaoma.spring" level="info" />
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
执行一个测试日志输出的单元测试看看效果:
![](https://i-blog.csdnimg.cn/blog_migrate/5311e775a4821128a26e9dcd3f11bc53.png)
说明
这里着重介绍了lombok的引入,用其提供的api极大的方便我们对POJO中相关选项的生成,以及简化日志的使用。我们将通过测试驱动的方式,采用用例覆盖并调试涉及的功能代码的调用,同时也通过日志输出能更好的观察程序的执行路径、涉及的组件是如何调用的。 注意,这里不推荐使用 System.out.println("输出日志"); 这种形式,因为不知道是哪个线程对哪个类进行的调用,不方便我们观察执行流程;另外,我们还可以对日志开启按照不同的级别高亮区分显示的功能。
编译模块
每次修改了功能代码或测试代码后,直接运行单元测试即可,编译时会自动对修改的模块代码执行基于构建缓存的更新(如果修改后的状态之前有构建缓存,则直接使用缓存构建),而其他模块的代码则保持最新的状态。
![](https://i-blog.csdnimg.cn/blog_migrate/c71ae836dc5011d537fe529105f3ccc1.png)