Giter VIP home page Giter VIP logo

thinking-in-spring-boot-samples's Introduction

《Spring Boot 编程**》

谨以此书纪念已故外婆 - 解厚群

本书全名为《Spring Boot 编程**》,是以 Spring Boot 2.0 为讨论的主线,讨论的范围将涵盖 Spring Boot 1.x 的所有版本,以及所关联的 Spring Framework 版本,致力于:

  • 场景分析:掌握技术选型
  • 系统学习:拒绝浅尝辄止
  • 重视规范:了解发展趋势
  • 源码解读:理解设计**
  • 实战演练:巩固学习成果

自序

扉页

“我是谁?”,是个不错的哲学问题。

在江湖上,大家亲切地称我 “小马哥“,我做公益,也做生意;在社区中,我又以 mercyblitz 的身份出没在众多开源项目,"mercy" 符合我的性格,"blitz" 说明我的风格。

承蒙错爱,不少的朋友对我过去的分享称赞有加,然而“千人之诺诺,不如一士之谔谔”,时常又让自己陷入一种迷思,到底是平台的帮衬,还是个人的确禁得起考验。于是我选择隐匿真名,希望能够听到更为真实的声音。尽管在互联网时代,只要稍作功课,个人信息几乎无处遁形。无可讳言,本人的所属公司以及职业头衔必然会形成“舞台效应”,如此一来,不但违背了写书的初衷,而且模糊了讨论的焦点。所以,本书即不会出现这些信息,又不会搞“个人崇拜”。它的价值应该体现在知识的传播,至于它的优劣则由诸君来评判。

交流社区

  • 微信公众号:次灵均阁

微信公众号二维码

小马哥 Java 星球

更多个人信息,请使用 Google 搜索 mercyblitz

thinking-in-spring-boot-samples's People

Contributors

chengxiaoqi avatar jxin-cai avatar mercyblitz avatar nealliu1990 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

thinking-in-spring-boot-samples's Issues

拼写错误

P239 第五行 context:annotation-config中间多了一个空格

✅ 感谢 @verichenn 反馈,已确认排版错误并收录~

问题咨询

第五章P100中介绍@SpringBootApplication注解时提到目前的SpringBoot版本在@ComonentScan中没有使用默认值,而是增加了连个排除的Fileter,那SpringBoot这么做是出于什么考量呢?小马哥了解吗?

43页,“故符合xxxx.startWith(BOOT_INF_LIB)的判断”,应该为“故符合xxxx.startWith(BOOT_INF_CLASSES)的判断”

43页,“故符合xxxx.startWith(BOOT_INF_LIB)的判断”,应该为“故符合xxxx.startWith(BOOT_INF_CLASSES)的判断”

✅ 谢谢 @nosqlcoco 反馈,已确认编写错误并收录~

Originally posted by @nosqlcoco in #3 (comment)

43页,感觉改了好像有点问题:源码里面并没有xxxx.startWith(BOOT_INF_CLASSES),改成xxxx.equals(BOOT_INF_CLASSES);又感觉不太对,请小马哥确认一下,不知道是不是我错了
源码:
@OverRide
protected boolean isNestedArchive(Archive.Entry entry) {
if (entry.isDirectory()) {
return entry.getName().equals(BOOT_INF_CLASSES);
}
return entry.getName().startsWith(BOOT_INF_LIB);
}

226页

@enable注解模块中的EnableWebFlux前面没有加@符号

7.3.4 Spring 注解属性别名与覆盖这一章节的疑惑

小马哥 @mercyblitz 你好,对于 Spring 注解属性覆盖与别名这一章节,个人觉得属性隐式覆盖例子使用 @Service@Component value 属性覆盖有点不合适。

测试过程中,发现隐式覆盖对于 value 属性不生效的,查看源码发现,其覆盖属性的排除了 value 属性。源码位置:

MergedAnnotationAttributesProcessor#postProcess 1613 行

    // Implicit annotation attribute override based on convention
    else if (!AnnotationUtils.VALUE.equals(attributeName) && attributes.containsKey(attributeName)) {
        overrideAttribute(element, annotation, attributes, attributeName, attributeName);
    }

Spring 版本 5.1.8-RELEASE

以下是我的测试例子。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Two
public @interface One {

    String value() default "";

    String name() default "one";
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Two {

    String value() default "Two";

    String name() default "two";
}
@One(value = "AnnotationAttributesTest",name = "AnnotationAttributesTest")
public class AnnotationAttributesTest {

    public static void main(String[] args) {
        AnnotatedElement annotatedElement = AnnotationAttributesTest.class;
        
        AnnotationAttributes oneAttributes =
                AnnotatedElementUtils.getMergedAnnotationAttributes(annotatedElement, One.class);

        AnnotationAttributes twoAttributes =
                AnnotatedElementUtils.getMergedAnnotationAttributes(annotatedElement, Two.class);


        print(oneAttributes);

        print(twoAttributes);
    }


    private static void print(AnnotationAttributes annotationAttributes) {

        System.out.printf("注解 @%s 属性集合 : \n", annotationAttributes.annotationType().getName());

        annotationAttributes.forEach((name, value) ->
                System.out.printf("\t属性 %s : %s \n", name, value)
        );
    }
}

输出结果:

注解 @com.spring.learning.customizescanning.annotation.One 属性集合 : 
	属性 name : AnnotationAttributesTest 
	属性 value : AnnotationAttributesTest 
注解 @com.spring.learning.customizescanning.annotation.Two 属性集合 : 
	属性 name : AnnotationAttributesTest 
	属性 value : Two 

从测试例子可以看到,隐式覆盖确实对 value 属性不生效。

所以个人觉得书中隐式覆盖的例子,会导致误解,认为隐式覆盖不会导致高层次同名属性值被低层次属性值覆盖(高层次属性值等于低层次注解属性值)。

或者说还是我对这个理解错误了?

spring-boot-2.0-samples/auto-configuration-sample缺少代码

书中第316页中的spring-boot-2.0-samples/auto-configuration-sample工程无法执行,由于缺少下面的引入
import thinking.in.spring.boot.samples.autoconfigure.formatter.Formatter;
import thinking.in.spring.boot.samples.autoconfigure.formatter.FormatterAutoConfiguration;

PDF版本

什么时候能卖spring boot编程**的PDF版本?已经购买了实体书版本,但是还想买一份电子书版本,可以利用碎片时间看一下,也方便做笔记

关于JarLauncher的思考

SpringBoot为什么要重新写一套解析嵌套Jar的东西。就比如A.jar,里边引用了B.jar和C.jar,那么A.jar就是一个嵌套的jar,在运行A.jar的时候,可以把B.jar和C.jar设置到classpath中,这种方式也可以运行啊。
不知道我的理解对不对。

P170页中缺少空格

P170中第一行如下所示:
没有标注@Component的情况下,通过sanner.addIncludeFilter(newAnnotationTypeFilter(Service.class))的方式达到识别@Service所标注类的目的

其中newAnnotationTypeFilter(Service.class)new没有空格隔开new AnnotationTypeFilter(Service.class)

P113页,单词拼写错误

P113页,正文第二行
【装配也能被关联到“starter”中,这些“starer”提供自动装配的代码及关联的依赖。】

单词拼写错误 第二个双引号中应为【starter】

##

58页,第三章,第二行,starter 错拼为 stater

【勘误】单词拼写错误

103 页正文第二段。

尽管 @CompoentScan 仅关注于 @component,然而由于 ......

@CompoentScan 修改为 @ComponentScan,望小马哥确认该问题!

PS:正文第二段中所有出现 @CompoentScan 均拼写错误,需要修改为 @ComponentScan

P21页,断句问题

P21页第一行,8080/HTTP服务器相应内容是否为‘’Welcome,My Buddy!‘’。中 8080/和HTTP中间应该加个逗号或者空格之类的进行分隔,这样语意更明确点。

前言 XIII 表达约定

本书的讨论内容可能对相同事务出现不同表述方式
其中“事务”是不是应该为“事物”?

【勘误】正文内容所属问题

91 页正文第一段。

当前 WebServer 实现类为 org.springframework.boot.web.embedded.undertow.UndertowWebServer。

该部分内容应该属于上方的日志打印部分,而不应出现在正文,望小马哥确认该问题!

✅ 谢谢反馈,已确认排版错误并收录~

43页第7行

第七行开始的这句话“xxx.startWith(BOOT_INF_CLASS)的判断”,在上面贴的代码里并未找到这句代码,只找到了“entry.getName().equals(BOOT_INF_CLASS)”和“entry.getName().startWith(BOOT_INF_LIB)”

第368页自定义starter问题

走向自动装配章节,FormatterAutoConfiguration会出现比JacksonAutoConfiguration提前被初始化的情况,也就是说在FormatterAutoConfiguration初始化的时候,ObjectMapper还没有被初始化,会导致如下条件永远成立
@bean
@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
@ConditionalOnMissingBean(type = "com.fasterxml.jackson.databind.ObjectMapper")
public Formatter jsonFormatter() {
return new JsonFormatter();
}
在个人测试过程中是这样,望小马哥解答。自动配置的顺序是如何控制的?

单词拼写错误

P15 倒数第5行 查看依赖树命令中 tree 与 -Dincludes未分隔开

✅ 谢谢 @verichenn 反馈,已确认排版错误并收录~

issue-文件名过长,导致克隆失败

git clone到本地的时候,提示错误信息如下:
error: unable to create file spring-boot-2.0-samples/externalized-configuration-sample/src/main/java/thinking/in/spring/boot/samples/externalized/configuration/bootstrap/ConfigurationPropertiesExternalizedConfigurationBootstrap.java (Filename too long)

请教 Filter 注册的问题

近期公司正在从 Spring 迁移到 SpringBoot,发现一个 incompatible change,查阅资料并没有找到解决方案,想请教「小马哥」一下。

在 Spring 环境中,Filter 是需要手动注册的,而在 SpringBoot 中,只要 Filter 被扫描到就会自动注册到 FilterChain 中,这样会导致部分应用启用了错误的 Filter 从而启动失败,请问这个问题怎么解呢?

目前已知的方案是将不需要的 Filter 排除在 ComponentScan 之外,但是需要每个工程手动指定,且枚举所有的 Filter 也很烦,还要承担之后如果有 classpath 下增加了新 Filter 仍然可能 GG 的风险,请问有没有其它方案,能手动启用所需的 Filter?

P112页拼写错误

P112页,
【从本次运行结果不难发现,所谓GLIB提升并非是@bean对象提供的】。
这个地方应该是CGLIB。少了个字母【C】。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.