摘要
依赖注入的三种方式:构造器注入、字段注入、Setter注入。本文使用Lombok的注解@RequiredArgsConstructor来实现构造器注入,并说明它与@Autowired字段/Setter注入的区别。
两者区别
@RequiredArgsConstructor+private final
| Spring推荐 | Spring4.x以后官方推荐构造器注入 |
|---|---|
| 空指针安全 | 启动时就要求所有final依赖必须注入,运行期不可能出现空指针异常 |
| 不可变性 | 字段天生final,对象一经创建就不可改变 |
| 测试方式 | 只需要new就可单元测试,无需Spring/SpringBootTest |
| 循环依赖检测 | 启动时若出现循环依赖直接抛异常,提前暴露问题 |
| 可选依赖 | 全部依赖都必须在构造器里,可选依赖需改用@Nullable或@Autowired(required=false) |
| 代码量 | 无样板代码 |
@Autowired
| Spring推荐 | 官方已不推荐使用字段注入 |
|---|---|
| 空指针安全 | 允许先new对象再注入,运行期可能出现空指针异常 |
| 不可变性 | 字段可变,可能被反射或测试代码二次修改 |
| 测试方式 | 必须使用Spring/SpringBootTest |
| 循环依赖检测 | 字段注入能在某些场景会自动解决循环依赖 |
| 可选依赖 | 选依赖可直接@Autowired(required=false) |
| 代码量 | 字段/Setter需写注解,构造器需手写或用Lombok注解 |
代码示例
@RequiredArgsConstructor
package org.coffeebeans.service;
import lombok.RequiredArgsConstructor;
import org.coffeebeans.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class DemoService {
private final DemoMapper demoMapper;
/*
自动实现了构造器
public DemoService(DemoMapper demoMapper) {
this.demoMapper = demoMapper;
}
*/
public void test() {
demoMapper.xxx;
}
}
@Autowired
package org.coffeebeans.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.coffeebeans.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
@Autowired
private DemoMapper demoMapper;
public void test() {
demoMapper.xxx;
}
}
总结
以上我们了解了如何使用Lombok注解@RequiredArgsConstructor来实现构造器注入的方式。
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。