一文浅析如何在Spring中配置自动注入

 更新时间:2026年04月10日 14:17:12   作者:用户93656888870  
本文介绍了Spring中的自动注入机制,包括在XML配置文件中手动配置自动注入、全局开启自动注入以及使用注解方式自动注入,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

Spring配置自动注入是什么

在 Spring 框架中,“自动注入”(Autowiring)是依赖注入(Dependency Injection, DI)的一种具体实现方式。它允许 Spring 容器自动识别 Bean 之间的依赖关系,并将所需的依赖 Bean “自动”注入到当前 Bean 中,而无需开发人员显式编写 setter 方法或构造函数参数。

简单说:你只需声明“我需要一个 X 类型的对象”,Spring 就会从容器中找出匹配的 X 实例,并帮你赋值

为什么需要自动注入?

  • 解耦:组件之间不直接通过 new 创建依赖,而是通过接口声明,降低耦合。
  • 易测试:可以轻松替换为 Mock 对象。
  • 可维护:依赖关系集中由 Spring 管理,修改依赖时无需改动大量代码。

XML 中配置自动注入(autowire)

在 ​​<bean>​​ 里加 ​​autowire​​ 属性即可实现自动注入。

四种自动注入策略

  • ​default​​:默认,不自动注入
  • ​byName​​:按属性名匹配 Bean 的 id
  • ​byType​​:按类型匹配(同类型只能有一个 Bean)
  • ​constructor​​:按构造方法参数注入

最常用:byType 按类型自动注入

<bean id="userDao" class="com.demo.dao.UserDaoImpl"/>

<!-- autowire="byType" 自动按类型注入 -->
<bean id="userService" class="com.demo.service.UserServiceImpl" 
      autowire="byType">
</bean>

Spring 会自动查找: ​​UserServiceImpl​​ 里的 ​​UserDao​​ 类型 → 找到 ​​userDao​​ → 自动注入。

byName 按名称注入

<bean id="userDao" class="com.demo.dao.UserDaoImpl"/>

<bean id="userService" class="com.demo.service.UserServiceImpl" 
      autowire="byName">
</bean>

要求:属性名 == bean 的 id​private UserDao userDao;​​ → 匹配 id="userDao"

全局开启自动注入(很少用)

<beans default-autowire="byType">

所有 Bean 都自动注入。

注解方式自动注入(企业开发 99% 用这个)

开启注解扫描(XML 里加一句)

<context:component-scan base-package="com.demo"/>

使用 ​​@Autowired​​ 自动注入(最核心)

@Service
public class UserServiceImpl implements UserService {

    // 自动按类型注入
    @Autowired
    private UserDao userDao;

}

不需要 set 方法!

@Autowired 工作机制

  • 默认 byType 按类型注入
  • 同一类型多个 Bean 时,会报错
  • 想按名称匹配,搭配 ​​ @Qualifier("beanId") ​
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;

@Resource(Java 标准注解)

效果和 @Autowired 类似,默认 byName

@Resource(name = "userDao")
private UserDao userDao;

构造器注入:官方推荐方式(Spring 4+)

Spring 官方文档明确推荐:对于强制性依赖,使用构造器注入

优点

  • 依赖不可变(可声明 final 字段)。
  • 便于单元测试(无需反射)。
  • 避免循环依赖(Spring 能检测构造器循环依赖并报错)。

示例

@Component
public class UserService {
    private final UserDao userDao;
    private final LogService logService;
    // 无需 @Autowired,Spring 4.3+ 自动推断
    public UserService(UserDao userDao, LogService logService) {
        this.userDao = userDao;
        this.logService = logService;
    }
}

最佳实践建议

优先使用构造器注入:对于必需依赖,使用构造器并尽量省略 @Autowired(Spring 4.3+)。

避免字段注入:它会使代码难以单元测试,且违反单一职责(依赖过多不易察觉)。

明确使用 @Qualifier:当存在歧义时,明确指定名称,避免隐式依赖。

利用 @Primary:为最常用的实现类标记为 @Primary,减少重复 @Qualifier

结合 Lombok:使用 @RequiredArgsConstructor 自动生成构造器,简化代码。

总结

  • XML 自动注入:​​autowire="byType/byName"​
  • 注解自动注入:​​@Autowired​​(企业首选)
  • 多个同类型 Bean:用 ​​@Qualifier​​ 指定名字

到此这篇关于一文浅析如何在Spring中配置自动注入的文章就介绍到这了,更多相关Spring配置自动注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何热更新线上的Java服务器代码

    详解如何热更新线上的Java服务器代码

    这篇文章主要介绍了详解如何热更新线上的Java服务器代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 如何使用Spring Security实现用户-角色-资源的权限控制

    如何使用Spring Security实现用户-角色-资源的权限控制

    文章介绍了如何通过SpringSecurity实现用户-角色-资源的权限管理,包括基于角色的请求控制、加载用户角色信息、角色与资源的关联等步骤,同时,提供了一些测试场景,以验证权限控制是否正确,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • java并发包工具CountDownLatch源码分析

    java并发包工具CountDownLatch源码分析

    这篇文章主要为大家介绍了java并发包工具CountDownLatch源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java线程中的notifyAll唤醒操作(推荐)

    Java线程中的notifyAll唤醒操作(推荐)

    这篇文章主要介绍了Java线程中的notifyAll唤醒操作,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • SpringBoot彩色日志配置方式

    SpringBoot彩色日志配置方式

    这篇文章主要介绍了SpringBoot彩色日志配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java中多个@Scheduled定时器不执行的解决方法

    java中多个@Scheduled定时器不执行的解决方法

    在应用开发中经常需要一些周期性的操作,比如每5分钟执行某一操作等,这篇文章主要给大家介绍了关于java中多个@Scheduled定时器不执行的解决方法,需要的朋友可以参考下
    2023-04-04
  • window系统安装jdk jre的教程图解

    window系统安装jdk jre的教程图解

    java开发少不了安装jdk,jdk可以同时安装多个版本,只要在项目部署时注意切换版本选择,下面小编给大家带来了window系统安装jdk jre的教程图解,感兴趣的朋友一起看看吧
    2018-08-08
  • 单例模式垃圾回收_动力节点Java学院整理

    单例模式垃圾回收_动力节点Java学院整理

    这篇文章主要为大家详细介绍了单例模式垃圾回收的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java编译和解释执行对比及原理解析

    Java编译和解释执行对比及原理解析

    这篇文章主要介绍了Java编译和解释执行对比及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 带有@Transactional和@Async的循环依赖问题的解决

    带有@Transactional和@Async的循环依赖问题的解决

    这篇文章主要介绍了带有@Transactional和@Async的循环依赖问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论