Java业务开发常见错误100例
朱晔
贝壳金服资深架构师
立即订阅
8974 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 业务代码真的会有这么多坑?
免费
代码篇 (23讲)
01 | 使用了并发工具类库,线程安全就高枕无忧了吗?
02 | 代码加锁:不要让“锁”事成为烦心事
03 | 线程池:业务代码最常用也最容易犯错的组件
04 | 连接池:别让连接池帮了倒忙
05 | HTTP调用:你考虑到超时、重试、并发了吗?
06 | 20%的业务代码的Spring声明式事务,可能都没处理正确
答疑篇:代码篇思考题集锦(一)
07 | 数据库索引:索引并不是万能药
08 | 判等问题:程序里如何确定你就是你?
09 | 数值计算:注意精度、舍入和溢出问题
10 | 集合类:坑满地的List列表操作
11 | 空值处理:分不清楚的null和恼人的空指针
12 | 异常处理:别让自己在出问题的时候变为瞎子
答疑篇:代码篇思考题集锦(二)
13 | 日志:日志记录真没你想象的那么简单
14 | 文件IO:实现高效正确的文件读写并非易事
15 | 序列化:一来一回你还是原来的你吗?
16 | 用好Java 8的日期时间类,少踩一些“老三样”的坑
17 | 别以为“自动挡”就不可能出现OOM
18 | 当反射、注解和泛型遇到OOP时,会有哪些坑?
19 | Spring框架:IoC和AOP是扩展的核心
20 | Spring框架:框架帮我们做了很多工作也带来了复杂度
答疑篇:代码篇思考题集锦(三)
设计篇 (7讲)
21 | 代码重复:搞定代码重复的三个绝招
22 | 接口设计:系统间对话的语言,一定要统一
23 | 缓存设计:缓存可以锦上添花也可以落井下石
24 | 业务代码写完,就意味着生产就绪了?
25 | 异步处理好用,但非常容易用错
26 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?
答疑篇:设计篇思考题答案合集
安全篇 (5讲)
27 | 数据源头:任何客户端的东西都不可信任
28 | 安全兜底:涉及钱时,必须考虑防刷、限量和防重
29 | 数据和代码:数据就是数据,代码就是代码
30 | 如何正确保存和传输敏感数据?
答疑篇:安全篇思考题答案合集
加餐 (8讲)
31 | 加餐1:带你吃透课程中Java 8的那些重要知识点(一)
32 | 加餐2:带你吃透课程中Java 8的那些重要知识点(二)
33 | 加餐3:定位应用问题,排错套路很重要
34 | 加餐4:分析定位Java问题,一定要用好这些工具(一)
35 | 加餐5:分析定位Java问题,一定要用好这些工具(二)
36 | 加餐6:这15年来,我是如何在工作中学习技术和英语的?
答疑篇:加餐篇思考题答案合集
37 | 加餐7:程序员成长28计
结束语 (3讲)
结束语 | 写代码时,如何才能尽量避免踩坑?
结课测试 | 关于Java业务开发的100个常见错误,你都明白其中缘由了吗?
结课问卷获奖用户名单
Java业务开发常见错误100例
15
15
1.0x
00:00/00:00
登录|注册

20 | Spring框架:框架帮我们做了很多工作也带来了复杂度

朱晔 2020-04-28
你好,我是朱晔。今天,我们聊聊 Spring 框架给业务代码带来的复杂度,以及与之相关的坑。
在上一讲,通过 AOP 实现统一的监控组件的案例,我们看到了 IoC 和 AOP 配合使用的威力:当对象由 Spring 容器管理成为 Bean 之后,我们不但可以通过容器管理配置 Bean 的属性,还可以方便地对感兴趣的方法做 AOP。
不过,前提是对象必须是 Bean。你可能会觉得这个结论很明显,也很容易理解啊。但就和上一讲提到的 Bean 默认是单例一样,理解起来简单,实践的时候却非常容易踩坑。其中原因,一方面是,理解 Spring 的体系结构和使用方式有一定曲线;另一方面是,Spring 多年发展堆积起来的内部结构非常复杂,这也是更重要的原因。
在我看来,Spring 框架内部的复杂度主要表现为三点:
第一,Spring 框架借助 IoC 和 AOP 的功能,实现了修改、拦截 Bean 的定义和实例的灵活性,因此真正执行的代码流程并不是串行的。
第二,Spring Boot 根据当前依赖情况实现了自动配置,虽然省去了手动配置的麻烦,但也因此多了一些黑盒、提升了复杂度。
第三,Spring Cloud 模块多版本也多,Spring Boot 1.x 和 2.x 的区别也很大。如果要对 Spring Cloud 或 Spring Boot 进行二次开发的话,考虑兼容性的成本会很高。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java业务开发常见错误100例》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥29.9
立即订阅
登录 后留言

精选留言(8)

  • Darren 置顶
    第一个问题:
    切入点指示符
    Spring AOP 支持10种切点指示符:execution、within、this、target、args、@target、@args、@within、@annotation、bean下面做下简记(没有写@Pointcut(),请注意):

    execution: 用来匹配执行方法的连接点的指示符。
    用法相对复杂,格式如下:execution(权限访问符 返回值类型 方法所属的类名包路径.方法名(形参类型) 异常类型)
    e.g. execution(public String com.darren.hellxz.test.Test.access(String,String))

    权限修饰符和异常类型可省略,返回类型支持通配符,类名、方法名支持*通配,方法形参支持..通配
    within: 用来限定连接点属于某个确定类型的类。
    within(com.darren.hellxz.test.Test)
    within(com.darren.hellxz.test.) //包下类
    within(com.darren.hellxz.test..) //包下及子包下

    this和target: this用于没有实现接口的Cglib代理类型,target用于实现了接口的JDK代理目标类型
    举例:this(com.darren.hellxz.test.Foo) //Foo没有实现接口,使用Cglib代理,用this
    实现了个接口public class Foo implements Bar{...}
    target(com.darren.hellxz.test.Test) //Foo实现了接口的情况

    args: 对连接点的参数类型进行限制,要求参数类型是指定类型的实例。
    args(Long)

    @target: 用于匹配类头有指定注解的连接点
    @target(org.springframework.stereotype.Repository)

    @args: 用来匹配连接点的参数的,@args指出连接点在运行时传过来的参数的类必须要有指定的注解

    @Pointcut("@args(org.springframework.web.bind.annotation.RequestBody)")
    public void methodsAcceptingEntities() {}

    @within: 指定匹配必须包括某个注解的的类里的所有连接点
    @within(org.springframework.stereotype.Repository)

    @annotation: 匹配那些有指定注解的连接点
    @annotation(org.springframework.stereotype.Repository)

    bean: 用于匹配指定Bean实例内的连接点,传入bean的id或name,支持使用*通配符

    切点表达式组合
    使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系

    第二个问题其实不太懂,网上搜了搜,核心应该是这个方法:
    org.springframework.util.PropertyPlaceholderHelper#replacePlaceholders(java.lang.String, java.util.Properties)

    参考链接:https://www.jianshu.com/p/5fecf71024af

    作者回复: 第二个问题,我给了我的实现:https://github.com/JosephZhu1983/java-common-mistakes/tree/master/src/main/java/org/geekbang/time/commonmistakes/springpart2/custompropertysource

    2020-04-28
    1
    13
  • 汝林外史
    感觉就在等最后的解决方案,然后戛然而止了。。。
    2020-04-29
    5
  • 梦倚栏杆
    1. 配置优先级的问题,理解热加载的时候仔细的看过,知道有这么回事,老师举得这个例子:开发和运维都设置了配置,然后运维的把开发的覆盖了,这种问题如果遇到了怎么查呢?如果是同一个人统一管理还好说,不同的人谁知道谁设置了什么呢?
    2. 切面不成功的内容,我卡在了切面上。切面怎么用还不太了解。

    作者回复: 可以参考我文中的例子,程序启动的时候检查一下所有配置项,发现有重复配置的话发出告警

    2020-04-28
    4
  • hellojd
    我也经常看框架源码,但缺失了老师的演示及溯源过程,学习到了。

    作者回复: :)

    2020-04-28
    2
  • 龙猫
    这节课有点难度啊
    2020-06-07
    1
  • Dimple
    源码之下无秘密,但是看源码挑战了一个程序员的心境,需要耐心,细心,恒心,给自己加油
    2020-07-23
  • 招财
    老师,我现在项目中遇到了一个问题,就是用springboot的全局异常处理时,响应出去的信息,编码格式都是ISO-8859-1,试过了在配置文件中设置spring.http.encoding.charset=utf-8和过滤器中给response去setCharacterEncoding为utf-8,但是还是不行。正常响应的数据是不乱码的,只有全局异常处理出去的响应有乱码,这个应该怎么解决呀

    作者回复: spring.http.encoding.charset=UTF-8
    spring.http.encoding.force=true
    spring.http.encoding.enabled=true
    试过吗?

    2020-05-21
    2
  • 旅途
    老师 问两个问题
    1.第一个例子 去掉ribbon依赖后 ApacheHttpClient注册了bean 所以@FeignClient这里面直接就使用的ApacheHttpClient的bea 不走那个new 的代码了是吗 ?
    2.第二个例子. ConfigurationPropertySourcesPropertySourcess这个类实际上一个代理 查询的走的还是其他的配置源 这么做的意义是什么?

    作者回复: 1. 去掉ribbon依赖后,ApacheHttpClient的注册方式就正确了,成为了一个Bean,而不是LoadBalancerFeignClient的delegate
    2、Spring这么干是为了实现relaxed binding,参考 https://spring.io/blog/2018/03/28/property-binding-in-spring-boot-2-0

    2020-05-03
收起评论
8
返回
顶部