我从来不用 spring,项目再大也不会考虑 spring 那套模式。什么依赖注入控制反转,叠床架屋,对开发和运维可以说有害无益。上文 zz Spring 是一种反模式 - Inshua - 博客园 也是一篇鄙视 spring 的雄文。

但是 spring 在 Java 世界非常流行,甚至有 Java 程序员声称用 Java 是因为有 spring。这让我大惑不解。spring 集成的 tomcat 之类没有一个适合高并发的,用 spring 开发 web 能到 c2k 已经谢天谢地了。

再说我也不是没见过 spring 项目,不就是把一堆东西堆在配置和注解的诡异代码?

须知一个项目的配置是有限的,配置文件足矣。spring 的项目几乎任何东西都可以配置,这就有点走火入魔了。在我看来,如果 XML 这么有用,XML 就应该成为编程语言,可惜它不是。前文 声明式编程的没落 - Inshua - 博客园 已经讨论过这个事情,这里不赘述。

要之,spring 这种打法就是对 Java 语言设计的一个嘲讽。Java 面向对象?NO,我 spring 面向接口!就像一个 COM 程序员跑进了 Java 世界,天哪!你们的类可以没有接口!这怎么行!大家怎么合作!也很像 C 程序员跑进 OO 世界:没有头文件怎么行!

只要我们多进行 OO 实践,不按 spring 的思路考虑问题,类就会无处不在,而不是接口。那样也能充分享受到 Java 带来的类的闭包性——内部类。

那么为什么 spring 这么流行,甚至很多人将 Java 开发等同于 spring 呢?我一直在找答案,今天终于得到了一位热心网友的解答。

好了,结论很清晰了。

理解你说的了,这么看来spring和微服务很像,都是人太多造成的。spring从工种切,高级工种甚至不需要摸低级工种创造的类名(@AutoWired)。微服务则从功能切,各有各的山头。

长期以来我的想法是,程序员个个都是产品创造者,我甚至主张程序员应该同时懂前端后端,自己负责自己的功能。之所以要很多人是因为功能多,需要多人合作,但是这些人大致是平行关系,即使有分工也互相都了解一点对方的技术。

spring 的组织政治和我设想的差别太大,这位网友也一样

我当时有一个暴论,但凡对编程有点热情的人都不会碰这坨。但是现实是,你需要组织一大群毫无热情的人干活…

你要让我选,我永远选小而精的小团队手工打造。但没人让我选…

这就是为什么我和 spring 这么格格不入了。

很多技术并非要解决技术问题。《代码3.0》有句经典名言“代码即法律,架构即政治”,这话放在 spring 和微服务,具有一种讽刺意味的贴合。

另一方面,我们做技术选型时一定要诚实,不要被各种愚昧的风潮左右。尤其是大公司的风潮,什么 spring、微服务、中台。我们要相信,团队既然是严格把关进来的,都是希望干点实事且有能力干实事的,他们早晚会干的和我们一样好,甚至超过我们。我们不能采用 spring 这种搞技术种姓制度的框架,让新人一辈子当低级程序员。作为程序员也要清醒,一个 web 接口,从 request 到 response 是彻底公开的规范,好的技术应当竭力让这个开发过程轻松,让产品运行高效。

我们也要尽量避免微服务这种烂技术,这种共享方法不是面向对象的,非常落后。

软件行业是一个快速更新的行业。我们看到,初创企业几乎都不用 spring,过去它们选 php ruby,现在 django 等等,这些技术都能给新企业带来成功。新的企业用务实轻便的技术弯道超车,通过市场竞争把旧的技术旧的公司和旧的公司政治打败,这是法则。

初创企业是一个新的希望,选择快速高效的技术栈吧——即使你用 java,也不要跟风,java 本不是 spring 那样的。

Spring 话题的更多相关文章

  1. Spring高级话题-@Enable***注解的工作原理

    出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...

  2. Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)

    一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...

  3. Spring Boot实战笔记(七)-- Spring高级话题(计划任务)

    一.计划任务 从Spring3.1开始,计划任务在Spring中的实现变得异常的简单.首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在执行计划任务的方法上注解@Sc ...

  4. Spring Boot实战笔记(五)-- Spring高级话题(Spring Aware)

    一.Spring Aware Spring 依赖注入的最大亮点就是你所有的 Bean 对 Spring容器的存在是没有意识的.即你可以将你的容器替换成其他的容器,如Google Guice,这时 Be ...

  5. springboot学习章节代码-spring高级话题

    1.Spring Aware(获取Spring容器的服务) hi, i am guodaxia! test.txt package com.zhen.highlights_spring4.ch3.aw ...

  6. Spring高级话题

    Spring Aware 在实际项目中,你不可避免的要用到spring容器本身的功能资源,这时你的bean要意识到spring容器的存在,才能调用spring提供的资源.spring aware本来就 ...

  7. Spring Boot实战(3) Spring高级话题

    1. Spring Aware Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器替换成别的容器. 实际项目中,不可避免地会用到Spring容 ...

  8. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  9. Spring Boot实战笔记(八)-- Spring高级话题(条件注解@Conditional)

    一.条件注解@Conditional 在之前的学习中,通过活动的profile,我们可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解 ...

  10. Spring Boot实战笔记(六)-- Spring高级话题(多线程)

    一.多线程 Springt通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中 ...

随机推荐

  1. LeetCode 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit (绝对差不超过限制的最长连续子数组)

    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件的子数组,则返回 ...

  2. 25. Socket与粘包问题

    1. Socket概念 Socket允许应用程序通过它发送或接收数据,对其进行像对文件一样的打开.读写和关闭等操作,从而允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.Socket ...

  3. ARM SMMU中 SteamTable的作用

    在 ARM SMMU(System Memory Management Unit)中,Stream Table 是一个非常关键的数据结构,它用于管理和映射设备的内存访问请求.它的作用主要体现在以下几个 ...

  4. pytorch: grad can be implicitly created only for scalar outputs

    运行这段代码 import torch import numpy as np import matplotlib.pyplot as plt x = torch.ones(2,2,requires_g ...

  5. kotlin更多语言结构——>相等性

    Kotlin 中有两种类型的相等性: - 结构相等(用 equals() 检测); - 引用相等(两个引用指向同一对象).   结构相等 结构相等由 ==(以及其否定形式 !=)操作判断.按照惯例,像 ...

  6. Whizard:跨越 Thanos 从开源项目到生产就绪的鸿沟

    此文是根据 KubeSphere 在 KubeCon China 2024 上的演讲分享整理而成. 议题简介 作为最受欢迎和强大的 Prometheus 长期存储项目之一,Thanos 被社区广泛采用 ...

  7. Java消息队列入门详解

    什么是消息队列? 消息队列的产生主要是为了解决系统间的异步解耦与确保最终一致性.在实际应用场景中,往往存在一些主流程操作和辅助流程操作,其中主流程需要快速响应用户请求,而辅助流程可能涉及复杂的处理逻辑 ...

  8. Redhat 7.6安装11G RAC GI时遇到此类报错

    环境:Redhat Linux 7.6 + Oracle 11.2.0.4 RAC 现象:图像化安装过程中,按照提示执行root.sh脚本,报错中断. 1. 具体现象 2. 定位问题 3. 解决问题 ...

  9. AI五子棋_06 坐标表示到图形表示的算法 Python实现

    AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...

  10. redis的主从复制master/slaver

    什么是Redis的复制 ​ 就是我们常说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 复制原理 Slave启动成 ...