怎么学习Spring

2,022 阅读8分钟

banner窄.png

铿然架构  |  作者  /  铿然一叶 这是铿然架构的第 92 篇原创文章

相关阅读:

JAVA编程思想(一)通过依赖注入增加扩展性
JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
JAVA编程思想(四)Builder模式经典范式以及和工厂模式如何选?
Java编程思想(五)事件通知模式解耦过程
Java编程思想(六)事件通知模式解耦过程
Java编程思想(七)使用组合和继承的场景
JAVA基础(一)简单、透彻理解内部类和静态内部类
JAVA基础(二)内存优化-使用Java引用做缓存
JAVA基础(三)ClassLoader实现热加载
JAVA基础(四)枚举(enum)和常量定义,工厂类使用对比
JAVA基础(五)函数式接口-复用,解耦之利刃
HikariPool源码(二)设计思想借鉴
【极客源码】JetCache源码(一)开篇
【极客源码】JetCache源码(二)顶层视图
人在职场(一)IT大厂生存法则


1. 要不要学习spring

1、如果你是java技术栈的。
2、如果你准备开发web应用,正在选型。

Spring是一个牛X的,伟大的开源框架,非常值得学习!

2. 为什么要学spring

spring的官网介绍

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.

spring具备的优点

- 强大、健全的基础能力,提供一站式的技术解决方案

如异常处理,国际化,资源管理,数据库访问,MVC框架,集成测试框架,多语言支持,各类网络通信支持WebFlux,WebClient,WebSocket。

- 生态和社区完善,开发者容易学习,快速上手。

官网资料详尽,结合这么多年的发展,各种网文,书籍,培训教程很多。

- 开发应用快速,简单,效率高

例如构建一个Restful接口:

@SpringBootApplication
@RestController
public class StartUpApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(StartUpApplication.class).run(args);
    }

    @GetMapping("/addNewBook")   //Resuful接口
    public String addNewBook(@RequestBody Book book) {
        // todo 添加书籍到数据库...
        return book.toString();
    }
}

这段代码启动了一个web应用,监听在8080端口,并提供了1个Restful接口。

再如Java的单例模式,实现如下:

public final class SingletonDemo {
    // 静态实例变量;volatile关键字修饰,保证跨线程可见
    private static volatile SingletonDemo singletonDemo = null;

    // 私有构造器,避免外部直接实例化
    private SingletonDemo() {}

    // 静态方法获取实例
    public static SingletonDemo getInstance() {
        // 先做一次判断,不为空则返回
        if (singletonDemo == null) {
            // 因为是静态实例,进程可见,需要在class上加锁(进程级加锁)
            synchronized (SingletonDemo.class) {
                // 双重检查,在等待SingletonDemo.class锁的时候,另外一个线程可能已经做了初始化
                if (singletonDemo == null) {
                    singletonDemo = new SingletonDemo();
                }
            }
        }
        return singletonDemo;
    }
}

而spring默认就是单例模式,只需要如下:

@Service //默认就是单例模式
public class SingletonDemo {
}

public class UseSingletonDemo {
    @Autowired //通过此注解注入
    SingletonDemo singletonDemo;
}

类似如上的两个例子,spring封装了通用的能力,只将变化点暴露给开发者,这也是迪米特法则的体现(最少知道原则),开发者不要关注具体实现,只要知道怎么用则可。

- 集成业界各种主流的开源框架,形成端到端的解决方案

Spring集成任务调度,数据库访问,缓存,批量处理,消息,安全.......

企业应用能用到的,spring都可以做集成。

- 与时俱进,跟随新技术

业界比较新的技术,优秀的软件,spring都会引入,这样就相当于帮你做了一次技术选型,不用自己再花费精力去研究,对比,只要了解如何使用则可。

例如:数据库连接池HikariPool,日志LogBack,单元测试框架,Web Reactive技术等等,这些在学习Spring的过程中都会了解到。

Spring作为一个学习入口,拓展开来可以了解到各种发展中的技术,开源框架。

- 扩展性强

体现在:
1、自身的核心思想,面向接口编程
2、Bean的生命周期管理
3、控制反转和依赖注入机制
4、AOP机制
5、易于和第三方开源软件做集成

3. 怎么学习

不仅仅针对学习Spring,学习任何开源框架,技术都一样。

3.1 学习资源

1、官网,比较全面,会讲原理,对很多人来说英文阅读速度慢,影响学习进展
2、书籍/小册,中文,学习快,由于更新快,会过时,找最近时间出版的口碑较好的来翻一翻
3、培训视频,不能一目十行,可以倍速播放,学习起来比较慢,视频效果要达到最好是能互动,讲解的时候能实时回答疑问
4、网文,参差不齐,有流水账,八股文,需要筛选

建议学习方式是官网 + 书籍 + 网文为主

官网可以让你知道具体有哪些知识点,覆盖面全,对于多数知识点以浏览为主,不需要太关注细节,实际用到的时候再花功夫学习。

书籍比较系统,中文版很多,能快速浏览知识点,学习起来比较快,同时结合官网查漏补缺。

网文用于查找书籍中没有讲解到的知识点和细节,以及demo实例。

3.2 学习重点

针对不同的人群重点不同。

1、初学者
以上手和落地应用为先,学习怎么用起来,例如怎么访问数据库,怎么使用MVC,怎么处理异常,国际化....

2、应试者
spring编程思想,常用的特性,新的技术特性如Web Socket,Web Reactive,以及应用场景要知道,优、缺点等等,能扩展开来阐述,这方面可以刷刷题。

一定要有实操经验,那样掌握才牢固,例如自己写starter,根据SPI原理自己实现,动态代理,AOP等等。

3、专家
到了这个级别,都有自己的一套学习方法和理论。

1)对Spring的特性,核心思想,机制很了解,并使用熟练。
2)通过spring了解到新的技术框架,有针对性的学习
3)解耦能力,扩展能力,分离关注点能力,产品和定制分工能力。
4)不限于Spring,具备提供整体解决方案能力,技术选型能力

3.3 学习方法

1、必要性->广度 -> 深度

从必要性入手,如果是做项目就选择项目中能用到的,如果是面试,就选择面试要考的。

广度可以让你知道一个产品具有哪些特性,什么特性应用什么场景,当真正碰到具体场景时知道有解决方案,能找到,能快速的提供解决方案,从广度来看,很多特性并不需要很大投入,了解,知道则可。

深度是对于重点的部分要深度理解,学习得比较扎实,比如Sprign核心的编程思想,重点特性,安全,bean的生命周期等等,需要深度掌握的知识要么是非常重要,例如安全,性能,要么就是对扩展,解耦等等很有帮助。

2、学习范围

spring的项目太多,不可能也没必要都学会,除非你是靠spring吃饭的,要成为spring方面的专家,比如是spring项目的参与者,或者专业的spring讲师,否则没有必要,因为大多数特性你在实际项目中用不到。(讲师其实也有选择,不常用的特性不会有多少听众,讲了也没有落地应用,得不到正反馈)

3、学习态度

不能急躁,不要指望立马全都掌握,特别是官网资料,都是英文,不少同学看起来就比较慢,没有成就感,这时可以官网结合网文一起看,另外对于暂时工作中用不到的,且非核心的,也不用急着实操,就扫一遍,了解则可,也不要都记住,能记多少记多少,后面回过头来再看几遍,自然就熟悉了,每看一遍都会加深理解(最多4遍,就差不多能get到所有点了)

4、个人定位

给自己的定位要比组织给你的定位高一点去学习,比如定位是一个普通开发,你自己要定位为一个高级开发,主动学习和解决高级开发要解决的问题,甚至定位为架构师要解决的问题,这样才能快速的提高个人能力。

5、误区

1)大而全,立志做到牛X,大神
不管是谁,都不需要大而全,知识点太多,不是都有必要全部掌握,否则时间根本不够用,并且长时间结束不了,反而打击积极性。

不要立flag,都要学完,觉得全会了才牛X,一个框架,能掌握30%, 40%的精华就很不错了,其他的只需要了解,碰到了现学。

2)事无巨细的去实操,整理demo集
抓住重点,初学的时候一些小功能可以练练手,例如Hello World,打印banner信息,后面对实际业务无关紧要的东西看看就好,不需要花时间去实操,等真正用到了再花时间,简单的东西,也很容易抄到,没有必要耗费时间。

end.


<--阅过留痕,左边点赞!