SSM框架——注入类型
引用类型的注入:Setter方法
简单类型的注入:
定义简单实例和方法
在配置文件中对bean进行配置,使用porperty属性 值用value(ref是用来获取bean的)
构造器方法:
构造器方法中需要写name,这样程序就会耦合度高。
使用type="java.lang.string"替换掉名称,可以解决形参名称耦合度高问题
使用index=0 索引值,当参数中有类型相同的,它可以解决参数相同问题。
总结:
Setter注入:Setter注入通过类的Setter方法(即属性设置方法)注入依赖对象。
- 灵活性高:可以在对象创建后动态修改依赖,适用于可选依赖或可能变化的依赖项。
- 代码可读性好:Setter方法通常具有明确的命名(如
setService()
),便于理解注入的内容。 - 可能导致部分初始状态不完整:由于依赖在对象创建后设置,可能在对象初始化时某些依赖未准备好,导致运行时错误。
public class UserService {private UserRepository userRepository;// Setter方法注入public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
构造器注入:构造器注入通过类的构造函数传入依赖对象,确保对象在创建时所有依赖已就绪。
- 强依赖性保证:对象一旦创建,依赖关系即确定,避免运行时因依赖缺失导致的错误。
- 适合强制依赖:适用于必须提供的依赖项,确保对象始终处于有效状态。
- 不可变性支持:结合
final
关键字(如Java),可以保证依赖对象不可变,提高线程安全性。 - 灵活性较低:一旦对象创建,依赖关系无法更改,不适合可选依赖或动态依赖场景。
public class UserService {private final UserRepository userRepository;// 构造器注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
主要区别
特性 | Setter注入 | 构造器注入 |
---|---|---|
依赖时机 | 对象创建后设置 | 对象创建时设置 |
依赖可变性 | 可动态修改 | 通常不可变(如结合final ) |
适用场景 | 可选依赖、动态配置 | 强制依赖、不可变对象 |
代码安全性 | 可能因依赖缺失导致运行时错误 | 编译时或创建时检查依赖完整性 |
框架支持 | 广泛支持(如Spring的XML/注解) | 广泛支持(推荐现代框架默认使用) |
选择建议
- 优先构造器注入:现代框架(如Spring 4.3+)推荐默认使用构造器注入,因其更强的安全性和不可变性支持。
- Setter注入适用场景:需要动态重新绑定依赖(如热部署)、可选依赖或遗留代码兼容时使用。