注入Java Bean的方式

简介: 本文总结了 Spring Boot 中常见的 Bean 注入方式,包括字段注入(`@Autowired`)、构造器注入(推荐)、Setter 方法注入、`@Resource` 按名称注入、`@Bean` 定义复杂 Bean、`@Value` 注入配置值、XML 配置、`ApplicationContextAware` 手动获取 Bean 以及 JSR-330 的 `@Inject`。同时分析了 Setter 注入逐渐被淡化的原因,强调构造器注入的不可变性和安全性优势,并推荐结合 Lombok 简化代码。文章还提供了按需选择注解的建议和最佳实践,帮助开发者根据场景选择合适的依赖注入方式。

Spring Boot 中注入 Bean 的常见方式如下,每种方式适用于不同的场景:


1. @Autowired 注解(字段注入)

  • 说明:按类型自动装配,可作用于构造器、Setter 方法、字段或普通方法。
  • 场景:大多数情况下的依赖注入。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Service
public class MyService {
    @Autowired // 字段注入
    private MyRepository repository;
}

2. 构造器注入(推荐)

  • 说明:通过构造器注入依赖,Spring 4.3+ 中若类只有单个构造器,可省略 @Autowired
  • 优势:强制依赖不可变,避免空指针。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Service
public class MyService {
    private final MyRepository repository;

    public MyService(MyRepository repository) { // 自动注入
        this.repository = repository;
    }
}

3. @Resource 注解

  • 说明:按名称注入(JSR-250 规范),默认按字段名或方法名匹配 Bean。
  • 场景:需明确指定 Bean 名称时。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Service
public class MyService {
    @Resource(name = "myRepositoryImpl")
    private MyRepository repository;
}

4. @Bean 方法(Java 配置类)

  • 说明:在 @Configuration 类中定义 @Bean 方法,返回对象由 Spring 管理。
  • 场景:配置第三方库组件或复杂 Bean。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

5. @Value 注解

  • 说明:注入配置文件属性或 SpEL 表达式。
  • 场景:注入简单值(如字符串、数字)或动态表达式。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Component
public class MyComponent {
    @Value("${app.timeout:1000}") // 注入配置,默认值 1000
    private int timeout;
}

6. XML 配置(传统方式)

  • 说明:通过 XML 定义 Bean,需配合 @ImportResource 导入。
  • 场景:遗留项目迁移或混合配置。
  • 示例

xml

  • 体验AI代码助手
  • 代码解读
  • 复制代码
<!-- applicationContext.xml -->
<bean id="myBean" class="com.example.MyBean"/>

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class App { ... }

7. ApplicationContextAware 手动获取

  • 说明:实现接口获取 ApplicationContext,直接调用 getBean()
  • 场景:非 Spring 管理类中动态获取 Bean(不推荐常规使用)。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Component
public class MyBean implements ApplicationContextAware {
    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }

    public void useBean() {
        MyService service = context.getBean(MyService.class);
    }
}

8. JSR-330 的 @Inject 注解

  • 说明:与 @Autowired 功能类似,需引入 javax.inject 依赖。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Service
public class MyService {
    @Inject
    private MyRepository repository;
}

9. Setter 方法注入

  • 说明:通过 @Autowired 注解标记在 Setter 方法上,Spring 会调用该方法注入依赖。
  • 场景
  • 可选依赖:依赖不是必须的(例如有默认实现)。
  • 动态重新注入:需要运行时更换依赖(较少见)。
  • 示例

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Service
public class MyService {
    private MyRepository repository;

    @Autowired // Setter 方法注入
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

Setter 方法注入是 Spring 中另一种常见的依赖注入方式,尤其是在早期 Spring 版本中广泛使用。可能因为它在现代 Spring Boot 项目中逐渐被构造器注入取代(官方推荐)


为什么 Setter 注入逐渐被淡化?

  1. 不可变性与安全性
  • 构造器注入能确保依赖在对象创建时就被初始化,避免 NullPointerException
  • Setter 注入允许依赖在对象创建后修改(除非代码刻意限制),可能破坏不变性。
  1. 代码简洁性
  • 构造器注入无需写 Setter 方法,减少样板代码(尤其配合 Lombok @RequiredArgsConstructor)。
  1. 框架演进
  • Spring 官方自 4.x 起推荐构造器注入,明确依赖的强制性,提升组件可靠性。

Setter 注入的合理使用场景

  • 可选依赖:依赖可能为 null,且有默认处理逻辑。

java

  • 体验AI代码助手
  • 代码解读
  • 复制代码
@Autowired(required = false) // 依赖不存在时不报错
public void setOptionalDependency(OptionalDependency dep) {
    this.dep = dep != null ? dep : new DefaultDependency();
}
  • 循环依赖:某些复杂场景下,Setter 注入可配合 @Lazy 解决循环依赖(但设计上应尽量避免循环依赖)。

9. 构造器注入最新方式

通过类的构造器注入依赖,结合 Lombok 的 @RequiredArgsConstructor 可自动生成构造器。

java

体验AI代码助手

代码解读

复制代码

@Service
@RequiredArgsConstructor // Lombok 自动生成构造器(注入方式)
public class UserService {
    private final UserRepository userRepository; // 依赖
}

为什么 Lombok 属于依赖注入?

  • Lombok 的作用:通过 @RequiredArgsConstructor 自动生成包含 final 字段的构造器,减少了手动编写构造器的代码量。
  • Spring 的配合:当类被声明为 Bean(如 @Service)后,Spring 会自动通过生成的构造器完成依赖注入。
  • 本质:Lombok 只是简化了依赖注入的代码编写,不参与 Bean 的声明过程

  • 优先使用构造器注入:强制依赖、不可变性、代码简洁性。
  • 按需使用 Setter 注入:可选依赖或特殊场景。
  • 避免滥用字段注入:虽然方便,但隐藏依赖关系,不利于测试和维护。

总结

  • 推荐方式:构造器注入(不可变依赖) + @Autowired(可选依赖)。
  • 避免使用:字段注入(不利于测试)和 ApplicationContextAware(破坏控制反转)。
  • 按需选择@Resource(按名称注入)、@Value(配置值)或 @Bean(复杂配置)。
  • Lombok 属于依赖注入的优化工具
  • 最佳实践:使用 @Component 等注解声明 Bean + 构造器注入(配合 Lombok 简化代码)。


转载来源:https://juejin.cn/post/7493866403407134746

相关文章
|
机器学习/深度学习 人工智能 搜索推荐
AIGC工具——文心一格
【1月更文挑战第12天】AIGC工具——文心一格
946 3
AIGC工具——文心一格
|
Dubbo Java 数据库连接
利用FactoryBean接口实例化,来实现dubbo接口调用和mybatis接口调用
Java编程规范中声明,Java接口类是不能直接实例化的,但是我们在平时的开发中经常会遇到只声明接口就可以直接使用的。 eg: 1. Mybatis中只用使用`@MapperScan`声明要扫描的Mapper接口类就可以直接从Spring中获取使用,进行操作数据库 2. Dubbo中只要用Dubbo提供的`@Service`注解,同样可以直接从Spring中获取使用进行远程调用。
608 0
|
11月前
|
算法 Java 测试技术
java性能调优涉及哪些方面
本文详细探讨了性能调优的各个方面,包括Java编程、多线程、JVM监控、设计模式和数据库调优。文章还介绍了性能调优的标准制定、介入时机、系统性能的影响因素,以及如何衡量和判断系统的性能与负载承受能力。最后,提出了性能调优的具体策略,包括代码、设计、算法优化及参数调整,并讨论了限流、智能化扩容等兜底策略。
167 0
java性能调优涉及哪些方面
|
4月前
|
人工智能 安全 Java
SpringBoot配置文件的12个实用技巧
本文介绍了SpringBoot配置的核心功能与最佳实践,涵盖多环境配置、属性优先级、松散绑定、随机值生成、类型安全配置、敏感信息加密、占位符使用、条件化加载、复杂数据结构配置及元数据支持等内容。通过合理运用这些特性,开发者可以提高应用的灵活性、可维护性和安全性,满足不同场景下的需求。文章结合具体示例,帮助读者深入理解并掌握SpringBoot配置的高级用法。
169 1
|
3月前
|
机器学习/深度学习 数据采集 人工智能
WebDancer:从零训练一个 DeepResearch 类智能体
WebDancer 是一款具备 Agentic 能力的智能体,能在开放网页环境中自主提问、搜索、推理并验证答案。它通过多步推理、信息整合与交叉验证解决复杂问题,如医学文献分析或政策追踪。WebDancer 采用 CRAWLQA 和 E2HQA 数据合成策略生成高质量训练数据,并结合 SFT(监督微调)+ RL(强化学习)双阶段训练方法,提升模型在动态环境中的适应性和泛化能力。其核心技术包括 ReAct 行为框架和 DAPO 强化学习算法,确保路径优化与策略稳定性。未来,WebDancer 将接入 Browser 工具链,拓展至代码沙盒、长文本写作等应用场景,进一步向通用智能体演进。
1065 27
|
3月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
558 1
Spring boot 使用mybatis generator 自动生成代码插件
|
5月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
260 14
|
3月前
|
运维 监控 Oracle
说一说死锁的 4 种排查工具
我是下假 期待与你的下一次相遇 ~
103 1
|
11月前
|
存储 缓存 固态存储
详解电子设备RAM和ROM
详解电子设备RAM和ROM
1870 0
|
11月前
|
XML JavaScript Java
BeanFactory 和 FactoryBean的区别
本文介绍了Spring框架中的`BeanFactory`和`FactoryBean`。`BeanFactory`是Spring的核心接口,用于管理Bean的创建、配置及依赖注入。其实现包括`DefaultListableBeanFactory`和已废弃的`XmlBeanFactory`。`FactoryBean`则用于动态创建Bean实例,支持懒加载及AOP代理创建。文章还通过示例展示了如何实现一个`FactoryBean`,并通过测试验证其功能。最后附上了作者信息及版权声明。
388 0
BeanFactory 和 FactoryBean的区别