spring的注入方式都有什么区别

目录

1. 构造器注入(Constructor Injection)

2. Setter 注入(Setter Injection)

3. 字段注入(Field Injection)

4. 接口注入(Interface Injection)

主要区别对比

最佳实践

总结

1. 构造器注入(Constructor Injection)

  • 方式:通过构造方法完成依赖注入。
  • 配置
    • XML:使用 <constructor-arg> 标签。
    • Java 注解:使用 @Autowired 或隐式构造器(Spring 4.3+)。
  • 示例

    java

    @RequiredArgsConstructor
    public class UserService {
        private final UserRepository userRepository;
    
        // 构造器注入(Spring 4.3+ 可省略 @Autowired)
        /*@Autowired
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }*/
    }
    
  • 特点
    • 不可变依赖:依赖对象在创建后不可变(final 字段)。
    • 强制依赖:对象创建时必须提供所有依赖,避免空指针异常。
    • 防止循环依赖:Spring 会在启动时检测并报错。
  • 适用场景
    • 强制依赖的场景(如核心业务组件)。
    • 不可变对象(如使用 final 字段)。

2. Setter 注入(Setter Injection)

  • 方式:通过公共的 Setter 方法完成依赖注入。
  • 配置
    • XML:使用 <property></
### 依赖注入方式概述 Spring框架提供了三种主要的依赖注入方式:基于构造器的依赖注入、基于Setter的依赖插入注入、以及基于字段变量的依赖注入。每种方式都有其特定的应用场景和优缺点。 #### 基于构造器的依赖注入 基于构造器的依赖注入是一种强制性的注入方式,它要求在创建对象时必须提供所有必需的依赖。这种方式通过构造方法来实现依赖的注入,确保了对象创建时的完整性。例如: ```java private final InventoryMapper inventoryMapper; public InventoryController(InventoryMapper inventoryMapper) { this.inventoryMapper = inventoryMapper; } ``` 这种方式的优点在于它可以确保依赖关系在对象创建之初就已经确定,并且可以解决循环依赖的问题[^3]。 #### 基于Setter的依赖注入 基于Setter的依赖注入是一种可选的注入方式,意味着即使没有注入某个依赖,也不会影响整个项目的运行。这种方式通过setter方法来实现依赖的注入,提供了更大的灵活性。例如: ```java private InventoryMapper inventoryMapper; public void setInventoryMapper(InventoryMapper inventoryMapper) { this.inventoryMapper = inventoryMapper; } ``` 这种方式适合那些可有可无的依赖,因为即使没有注入这些依赖,也不会导致程序运行失败[^3]。 #### 基于字段变量的依赖注入 基于字段变量的依赖注入利用了@Autowired注解来实现,这种方式非常简洁,没有多余的代码,提高了Java代码的简洁性。例如: ```java @Autowired private InventoryMapper inventoryMapper; ``` 尽管这种方式非常方便,但它的一个主要缺点是不能明确指出具体的依赖,可能导致依赖注入的对象为null。此外,这种方式过于依赖注入容器,当没有启动整个依赖容器时,这个类就不能正常工作[^3]。 ### 依赖注入方式区别 不同的依赖注入方式适用于不同的场景。基于构造器的方式适用于那些必须存在的依赖,而基于Setter的方式则适用于那些可选的依赖。基于字段变量的方式虽然简洁,但其缺点也显而易见,特别是在测试和非容器环境中使用时需要特别注意。 #### 注解区别及应用 除了上述的依赖注入方式之外,Spring还提供了一些注解来简化配置,如@Component、@Repository、@Service、@Controller等。其中@Component是所有受Spring管理组件的通用形式,而其他注解则是对@Component的进一步细化,分别对应不同的应用层级[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值