Spring 生态覆盖对象容器(IOC)、横切逻辑(AOP)、安全(Security / Shiro)、模板、云原生与 AI 接入,下面分块讲清各自的边界与坑。
一、容器核心:IOC 把对象创建与依赖装配交给容器
IOC 把对象创建与依赖装配交给容器。BeanDefinition 描述如何构造,ApplicationContext 刷新时实例化单例。@ComponentScan、@Bean、@Autowired 是常见入口。循环依赖用三级缓存处理 setter 注入,构造器循环仍会失败。作用域有 singleton / prototype / request。生命周期回调用 InitializingBean 与 DisposableBean。条件装配用 @Conditional。测试用 @SpringBootTest 或切片测试。
几个容易踩的点
- getBean 满天飞。不要用 getBean 满天飞,优先构造器注入。
- 配置类过重。配置类避免过重逻辑;多模块用 @Import 组织。
- 构造器循环依赖。构造器循环依赖会失败,需要重新设计依赖方向。
- 排错不看自动配置报告。排错时开 debug 看自动配置报告,定位哪个 Bean 没生效。
什么时候用:Android 不用 Spring,那是服务端故事——移动端有另一套依赖组织方式。
二、AOP:用代理在方法调用前后插入切面
AOP 用代理在方法调用前后插入切面:日志、事务、权限。注解 @Aspect 定义 pointcut 与 advice。接口走 JDK 代理,类走 CGLIB。自调用绕过代理是经典坑。事务 @Transactional 本质就是 AOP。顺序用 @Order。仅 public 方法默认被代理(CGLIB 可不同)。异常回滚规则要看 checked 异常与 rollbackFor。Spring AOP 是运行时织入,与 AspectJ 的编译织入不同。
几个容易踩的点
- 自调用绕过代理。同一类里方法互调会绕过代理,切面不生效;要拆 bean 或用 AopContext。
- 切面过宽难调试。能用组合/装饰器就不要上切面;切面过宽会让调试困难。
- 回滚规则看错异常。异常回滚规则要看 checked 与 rollbackFor,别默认所有异常都回滚。
什么时候用:验证切面是否生效,测试可用 @SpyBean;启动时看代理类名,确认织入是否按预期发生。
三、安全防护:Spring Security 的过滤器链
Spring Security 用过滤器链处理认证授权。SecurityFilterChain 声明哪些路径要登录、哪些 permitAll。默认 CSRF 对浏览器表单开启,纯 API 常关 CSRF 改用 token。AuthenticationManager 校验用户。方法级用 @PreAuthorize。OAuth2 Resource Server 验 JWT。密码编码器必须用 BCrypt 等。会话固定攻击防护默认开。6.x 用 Lambda DSL 替代 antMatchers 老 API。调试看 TRACE logging。前后端分离把 CORS 与 Security 一起配。测试用 @WithMockUser。
几个容易踩的点
- 纯 API 仍开着 CSRF。纯 API 常关 CSRF 改用 token,否则表单防护会挡掉正常请求。
- 密码编码器用明文/弱算法。密码编码器必须用 BCrypt 等,不能自己存明文。
- 登录差异泄露用户是否存在。自定义 UserDetailsService 不要泄漏「用户是否存在」的差异过大,避免被枚举。
什么时候用:新项目服务端安全首选 Spring Security。
四、旧系统安全:Apache Shiro 的认证授权
Apache Shiro 把认证、授权、会话、加密拆开:Subject 是当前用户,SecurityManager 协调 Realm 取身份与权限。INI 或 Realm 实现可对接 JDBC / LDAP。注解 RequiresPermissions 做方法级控制。会话可脱离 HttpSession,方便非 Web 场景。密码用 Matcher。过滤器链配路径。与 Spring 集成有 shiro-spring。
几个容易踩的点
- RememberMe 密钥与 Cookie 安全。维护旧系统时注意 RememberMe 密钥与 Cookie 安全,密钥泄露可被伪造。
- 授权信息每次打远程。自定义 Realm 不要在 doGetAuthorizationInfo 里打远程每次都全量,开销大。
- 权限变更缓存不失效。缓存 AuthorizationInfo 要在权限变更时失效,否则新权限不生效。
什么时候用:新项目更多用 Spring Security 或 Sa-Token;Shiro 主要用在维护旧系统时。
五、服务端模板:Thymeleaf 贴近 HTML 的渲染
Thymeleaf 是 Spring 生态里常用的服务端模板引擎,模板本身是能在浏览器里打开的 HTML。它用 th:text、th:each、th:if 和布局方言把数据和页面拼起来。和 Freemarker 相比更自然地贴近 HTML,和前后端分离相比适合后台管理、邮件和需要 SEO 的页面。Spring Boot 默认的模板前缀是 classpath:/templates/。自然模板让设计师改页面时少踩标签错误,但复杂逻辑仍应放在控制器或 DTO。
三个容易踩的坑
- XSS 风险。转义默认开启:用户输入用 th:text,只有受信片段才 th:utext,防止 XSS。
- 片段不复用。片段复用靠 th:insert 和布局方言:页头页尾不要复制,改一处全站生效。
- 逻辑堆模板里。和 Spring 校验、国际化集成时,字段错误和消息码可直接在模板里取。
什么时候用:管理后台、邮件正文和传统 MVC 站点适合 Thymeleaf。纯 SPA 不必。新项目如果已经前后端分离,就不要为了统一再塞一套服务端渲染,除非有明确的首屏或爬虫需求。
六、云原生选型:SCA vs SCK
SCA 通常指 Spring Cloud Alibaba,把 Nacos、Sentinel、Seata 等接入 Spring Cloud 编程模型,适合阿里云技术栈和国内中间件。SCK 指 Spring Cloud Kubernetes,用 K8s Service、ConfigMap 和 Discovery 取代自建注册中心。前者保留熟悉的 Java 中间件运维方式,后者把服务发现下沉到集群原语,少一套 Eureka / Nacos 也可运行。选型看部署目标:大量存量 Dubbo / Nacos 用 SCA 更平滑;云原生纯 K8s 用 SCK 更干净。混用时要分清谁负责配置刷新和负载均衡,避免两套发现互相打架。
几个容易踩的点
- 两套服务发现互相打架。混用 SCA 与 SCK 时,避免两套发现机制冲突。
- 只靠客户端重试。无论哪边,健康检查和优雅下线都要接到探针,而不是只靠客户端重试。
什么时候用:按部署目标选——存量 Dubbo / Nacos 用 SCA,云原生纯 K8s 用 SCK,两者不要无脑混用。
七、AI 接入:Spring AI 把聊天 / 嵌入 / RAG 接进 Bean
Spring AI 把聊天模型、嵌入、RAG 和函数调用接到 Spring 的配置与依赖注入里。ChatClient 面向应用代码,ChatModel 对接具体供应商,Advisor 可插入检索或日志。向量存储、工具方法和观测都可以用熟悉的 Bean 方式管理。对已经在跑 Spring Boot 的团队,它减少了自己拼 HTTP 客户端的工作。
几个容易踩的点
- RAG 切片甩给框架。接入时把密钥放配置中心,按环境切换模型;但 RAG 的切片与元数据仍要自己设计,框架只提供管道。
- 函数调用不校验。函数调用要做参数校验和超时,不能把外部入参直接透传。
- 不写集成测试。评估提示和工具时写集成测试,避免版本升级 silently 改行为;和 Spring AI Alibaba 等发行版对齐文档版本。
什么时候用:先跑通一个有观测的对话接口,再扩展多模态,比一上来堆所有能力更稳。
附:Spring 生态选型速查表
| 场景 | 用什么 | 不要用什么 |
|---|---|---|
| 对象创建与依赖装配 | Spring IOC + 构造器注入 | getBean 满天飞、配置类塞过重逻辑 |
| 日志 / 事务 / 权限等横切逻辑 | Spring AOP(@Aspect) | 切面过宽、用自调用期望切面生效 |
| 新项目服务端安全 | Spring Security(BCrypt + @PreAuthorize) | 纯 API 还开 CSRF、密码明文、泄露用户存在性 |
| 维护旧系统 / 非 Web 会话 | Apache Shiro | 新项目盲目选 Shiro、RememberMe 密钥硬编码 |
| 后台管理 / 邮件 / 需 SEO 页面 | Thymeleaf | 纯 SPA 硬上服务端渲染、复杂逻辑堆模板 |
| 存量 Dubbo / Nacos、阿里云栈 | Spring Cloud Alibaba(SCA) | 与 SCK 无脑混用导致两套发现打架 |
| 云原生纯 K8s | Spring Cloud Kubernetes(SCK) | 只靠客户端重试、不接探针 |
Spring 生态核心:容器、安全与周边组件怎么选
https://lautung.com/archives/spring-ecosystem
评论