使用构造器注入替代 @Autowired 注解

使用构造器注入替代 @autowired 注解

本文旨在讲解如何使用构造器注入来替代 Spring 框架中的 @Autowired 注解,从而实现更简洁、更易于测试的代码。我们将通过一个实际案例,展示如何利用 Lombok 提供的 @AllArgsConstructor 注解简化构造器注入的过程,并解决可能遇到的问题,最终避免手动创建 Bean。

在 Spring 框架中,依赖注入是一种核心机制,它允许我们将对象之间的依赖关系交给 Spring 容器来管理。@Autowired 注解是一种常用的依赖注入方式,但它并非唯一的选择。构造器注入是另一种更推荐的方式,它可以提高代码的可读性和可测试性。

构造器注入的优势

相比于字段注入(使用 @Autowired 注解在字段上),构造器注入具有以下优势:

强制依赖: 构造器注入可以确保 Bean 在创建时必须提供所有必需的依赖项,从而避免了空指针异常的风险。不可变性: 通过将依赖项声明为 final,可以确保它们在 Bean 创建后不会被修改,从而提高代码的安全性。易于测试: 构造器注入使得单元测试更加容易,因为我们可以直接通过构造器传递 mock 对象,而无需使用反射或其它复杂的测试技巧。

使用 Lombok 简化构造器注入

Lombok 是一个 Java 库,可以帮助我们减少样板代码。它提供的 @AllArgsConstructor 注解可以自动生成包含所有 final 字段的构造器,从而简化构造器注入的过程。

例如,假设我们有以下类:

import lombok.AllArgsConstructor;import org.springframework.stereotype.Component;import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@AllArgsConstructor@Componentpublic class AuthTokenFilter extends OncePerRequestFilter {    private final JwtUtils jwtUtils;    private final UserDetailsServiceImpl userDetailsService;    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        //method implementation    }}

在这个例子中,@AllArgsConstructor 注解会自动生成一个包含 jwtUtils 和 userDetailsService 作为参数的构造器。Spring 容器会自动识别这个构造器,并将相应的 Bean 注入到 AuthTokenFilter 中。

小绿鲸英文文献阅读器 小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器 199 查看详情 小绿鲸英文文献阅读器

注意:

确保你的项目中已经添加了 Lombok 的依赖。如果你的 Bean 只有一个构造器,Spring 会自动将其视为自动装配的构造器,即使没有显式地使用 @Autowired 注解。使用 @Component 注解将 AuthTokenFilter 类声明为一个 Spring Bean。

移除手动 Bean 创建

在使用构造器注入后,通常不需要手动创建 Bean。在原始代码中,可能存在以下代码:

@Beanpublic AuthTokenFilter authenticationJwtTokenFilter() {    return new AuthTokenFilter();}

这段代码是多余的,并且会导致错误,因为它没有传递任何参数给 AuthTokenFilter 的构造器。删除这段代码,让 Spring 容器自动创建和管理 AuthTokenFilter Bean。Spring 会自动发现 @Component 注解,并创建 AuthTokenFilter 实例,同时注入 JwtUtils 和 UserDetailsServiceImpl 依赖。

总结

通过使用构造器注入和 Lombok 的 @AllArgsConstructor 注解,我们可以简化 Spring 应用程序中的依赖注入,提高代码的可读性、可测试性和安全性。记住,Spring 容器会自动管理 Bean 的生命周期,因此通常不需要手动创建 Bean。

以上就是使用构造器注入替代 @Autowired 注解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/213589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月3日 13:50:15
下一篇 2025年11月3日 13:54:17

相关推荐

  • “Zenith”——一款使用 React、Tolgee 和 Tailwind CSS 的宁静冥想应用程序

    在这篇文章中,我很高兴与大家分享 zenith,这是一款冥想应用程序,旨在通过精选的舒缓声音、用户友好的界面以及对多种语言的支持来帮助用户平静和集中注意力。我将介绍该应用程序的核心功能、技术堆栈、如何设置以及在 react 中集成 tolgee。 演示 特点 舒缓的声音:用户可以从各种专为增强冥想效…

    2025年12月19日
    000
  • 初次接触 Vite 如何学习?一份循序渐进的路线图

    vite 学习路线图 对于初次接触 vite 的开发者来说,探索学习路径可能令人困惑。以下是一个循序渐进的学习建议: 配置基础 从 vite 配置开始学习是明智的,因为它为理解该工具的运作方式提供了基础。重点关注项目中常用的配置,包括: base:指定要部署应用程序的 URL 基础路径build.o…

    2025年12月19日
    000
  • 异步代码中 try/catch 无法捕获 refreshData 错误的原因是什么?

    异步代码中跳过 try/catch 问题的原因 在您提供的代码中,try/catch 代码没有执行的原因是因为 refreshdata 函数没有按照异步约定编写。 通常情况下,不建议在 new promise() 内使用 async 函数。如果您希望使用 await,则可以直接将外部函数声明为 as…

    2025年12月19日
    000
  • 为什么js同步代码中的try/catch无法捕获async函数抛出的异常?

    js中同步代码里为何没有执行try/catch代码? 在提供的代码片段中,refreshdata函数被设计为当token超时时刷新token。然而,在执行try/catch代码之前,程序打印了123,这表明catch块没有被触发。原因在于: 通常情况下,在新创建的promise内部使用async函数…

    2025年12月19日
    000
  • 旅游记事本

    TravelTally – 旅行费用的预算和费用管理工具。 TravelTally 是一款旅行预算规划工具,用户可以通过跟踪与旅行相关的费用(包括机票、住宿和活动)来有效管理自己的财务。用户可以监控他们的预算,查看与分配的预算相比他们花了多少钱,并获得内置 Copilot 助手的帮助。该…

    2025年12月19日
    000
  • React-Query 用户,请看一下:表单提交可以这么简单吗?

    嘿,我的前端开发者们!今天给大家分享一个超级好用的工具——alovajs的表单提交策略。说实话,这件事对我的帮助确实很大。还记得之前处理token认证时的繁琐操作吗?现在,有了这位经理,一切都变得简单多了。 什么是 alovajs? alovajs 是下一代请求工具。 与react-query、sw…

    2025年12月19日
    000
  • 地图信息弹窗是如何实现的?

    地图信息弹窗的奥秘 您是否曾好奇某些地图应用是如何在点击点位置显示详细文本信息?此功能称为信息窗体,是地图开发中必不可少的元素。了解其实现原理至关重要。 信息窗体的实现 一般的地图库都会提供相应的 api 来实现信息窗体。例如,高德地图 api 中提供了对应的方法。具体步骤如下: 初始化地图:创建地…

    2025年12月19日
    000
  • 面向未来的身份验证:从规则和挂钩转向行动

    auth0 是一个身份和访问管理 (iam) 平台,可简化应用程序中身份验证和授权的管理。我们开发人员依靠 auth0 规则和 hooks 来自定义身份验证过程。然而,随着 auth0 actions 的引入,现在有一个更灵活、可维护和现代的解决方案来实现自定义身份验证逻辑。 为什么要迁移?随着我们…

    2025年12月19日
    000
  • 微信小程序如何实现多语言功能?

    微信小程序多语言实现解析 基于微信小程序的国际化需求,本文将分析多语言实现方案,并提供技术实现指导。 一、本地静态资源国际化 为本地静态文本实现国际化,开发者可以通过创建多个json文件,分别存储不同语言的文本。例如: 英文: { “confirm”: “confirm”, “cancel”: “c…

    2025年12月19日
    000
  • 微信小程序多语言实现:动态内容翻译如何解决?

    微信小程序多语言实现在哪安排? 各位,祝大家新年快乐! 小程序多语言的需求不少见,今天就来聊聊实现方法。先说说传统手法: 手动配置 json 语言包 简单来说,就是写一大堆 json 文件,每种语言一种。这种方法虽然基础,但繁琐且需人工维护。 现成的多语言 json 包? 抱歉,没有这种东西。你的商…

    2025年12月19日
    000
  • 伪元素自动换行问题:如何在限制最大宽度的情况下实现文本内容撑开宽度且不自动换行?

    伪元素自动换行问题 在使用伪元素时,如何让其宽度既能根据文本内容自动调整,又能限制在最大宽度内,并且在小于最大宽度时不自动换行,大于最大宽度时才换行? 问题分析 使用 white-space: nowrap; 虽然可以让文字较少时正常显示,但文字超过最大宽度后不会换行;而使用 word-wrap: …

    2025年12月19日
    000
  • 如何实现可折叠展开的 JSON 可视化功能?

    如何实现可折叠展开的 json 可视化功能? 本文将介绍如何通过自定义 javascript 函数和 html 模板来实现类似的 json 可视化功能。 步骤 创建 html 模板: 定义一个 作为根容器,将 json 可视化显示在这个容器中。定义一个 作为模板,其中包含不同类型的 json 值的模…

    2025年12月19日
    000
  • 如何使用 JavaScript 和 HTML 实现 JSON 数据的可折叠展开功能?

    要实现可折叠展开的 json 可视化功能,可以借助 javascript 和 html 来完成。具体实现步骤如下: 首先,创建一个用于显示 json 数据的 html 容器: 在模板中定义各种 json 类型值的 html 结构: : , : , : , : , : , : [ … ] , : …

    2025年12月19日
    000
  • Docsify-cli 脚手架安装报错:如何解决 npm ERR! code ETIMEDOUT?

    docsify-cli 脚手架安装报错 在使用 docsify-cli 脚手架进行安装时,用户可能会遇到以下报错: npm err! code etimedoutnpm err! syscall connectnpm err! errno etimedoutnpm err! network requ…

    2025年12月19日
    000
  • React Js 部分事件处理和表单管理

    欢迎回到我们的 react 系列!在上一篇文章中,我们讨论了组件、状态和属性——为构建 react 应用程序奠定基础的基本概念。在这篇文章中,我们将探讨 react 中的事件处理和表单管理。了解这些概念将使您能够使您的应用程序具有交互性并响应用户输入。 了解 react 中的事件处理 react 中…

    2025年12月19日
    000
  • 如何在 TinyMCE 中监听附件的插入和删除变动?

    用 tinymce 实现附件变动监听 在 tinymce 使用附件插件时,监视器无法监听附件的插入和删除变动。如何解决这一问题? 已实现的解决方案: 移除 v-model 在 init 中添加回调: tinymce.init({ … attach_callbacks: { blur: funct…

    2025年12月19日
    000
  • Nuxt 中的请求上下文

    介绍 nuxt 最近引入了一项实验性功能:使用 nodejs asynclocalstorage 的异步上下文支持。 此增强功能有望简化开发人员跨嵌套异步函数管理上下文的方式,但还有更多! 需要注意的是,“实验性”标签是由于跨平台支持有限;但是,在使用 nodejs 时它很稳定,使其成为在该环境中工…

    2025年12月19日
    000
  • 使用 Swiper.js 实现鼠标滚轮滑动分页效果的具体步骤是什么?

    一个网页实现沿鼠标滚轮滑动分页效果的方法 在浏览网页时,有时我们会遇到这样一个效果:当鼠标滚轮向下滚动时,网页的内容会向下滑动一个固定高度,就像翻页一样。实现这种效果的方法之一是使用 swiper.js 滑动库。 实现步骤: 生成一个包含所有内容的滚动容器。这可以是一个 div 容器,其中包含网站的…

    2025年12月19日
    000
  • 使用不可构造类型的 TypeScript 中的丰富编译时异常

    typescript 的类型系统很强大,但它的错误消息有时可能很神秘且难以理解。在本文中,我们将探索一种使用不可构造类型来创建清晰的、描述性的编译时异常的模式。这种方法通过使无效状态无法用有用的错误消息来表示来帮助防止运行时错误。 模式:具有自定义消息的不可构造类型 首先,我们来分解一下核心模式: …

    2025年12月19日
    000
  • 修复 JS 项目中的包安全漏洞的步骤

    当您安装的软件包或其依赖项中检测到安全漏洞时,github 会定期向您发送警报。我曾经尝试让 dependentabot 为我修复它们。然而,有一半的时间我无法合并为我生成的 pr。结果,违规行为就被赤裸裸地处理了,这可不好。就我而言,我使用 pnpm,我想它与 npm 相同。 我今天看到了 Nir…

    2025年12月19日 好文分享
    000

发表回复

登录后才能评论
关注微信