当前位置: 代码网 > it编程>编程语言>Java > 一文浅析如何在Spring中配置自动注入

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

2026年04月10日 Java 我要评论
spring配置自动注入是什么在 spring 框架中,“自动注入”(autowiring)是依赖注入(dependency injection, di)的一种具体实现方式。它

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配置自动注入内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com