依赖注入(Dependency Injection,简称DI),是IOC的一种别称,用来减少对象间的依赖关系。提起依赖注入,就少不了IOC。IOC(Inversion of Control,控制反转)是一种设计思想,它将原本在程序中手动创建对象的控制权,交由Spring框架来管理。IOC和DI,是同一个概念的不同角度描述。(IOC是一种思想,DI则是该思想的一种具体的技术实现方案。) 也可以这么理解:IOC是目的(目的是创建对象),DI是手段(通过什么手段获取外部对象)。
依赖注入的常见实现方式
构造函数注入、setter方法注入、属性注入是依赖注入的常见实现方式。
构造函数注入
将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。
@RestController
public class UserController {
// 构造方法注入
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}
该方式的优点:
- 可注入不可变对象
- 注入对象不会被修改
- 注入对象会被完全初始化
- 通用性更好
该方式的缺点:
- 当需要依赖的对象过多,构造方法会臃肿
setter方法注入
在JavaBean中,通常会通过setXXX()和getXXX()方法来访问对应属性。这些setXXX()方法统称为setter方法,getXXX()方法统称为getter方法。通过setter方法,可以更改相应的对象属性,通过getter方法,可以获得相应属性的状态。
@Service
public class UserService {
private SmsService smsService;
@Autowired //通过setter方法实现注入
public void setWolf3Bean(SmsService smsService) {
this.smsService = smsService;
}
}
该方式的优点:
- 完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象
该方式的缺点:
- 不能注入不可变对象(final 修饰的对象)
- 注入的对象可被修改
属性注入
属性注入,就是在bean的变量上使用注解进行依赖注入。
@RestController
public class UserController {
// 属性对象
@Autowired
private UserService userService;
@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}
该方式的优点:
- 使用简单
该方式的缺点:
- 不能注入不可变对象(final 修饰的对象)
- 注入的对象可被修改
- 只能适应于 IoC 容器
总结
在实际开发中,根据不同的场景,选择不同的注入方式。简单来说,就是
- 强制依赖就用构造器方式
- 可选、可变的依赖就用setter注入
但,日常开发应该还是属性注入较多~
未经允许不得转载:大白鲨游戏网 » 依赖注入的常见实现方式