1、属性注入
属性注入是通过 @Autowired注解实现的
以下例子,是将Service类注入到Controller
Controller代码实现如下
import com.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Autowired
public UserService userService;
public void sayHi(){
System.out.println("do UserControler sayhi");
userService.sayHi();
}
}
2、setter注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
3、构造方法注入
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
可以看出以上方法都可以得出结果,但是他们也有各自的不足之处
属性注入的优缺点
1、功能性问题:无法注入一个不可变的对象(final 修饰的对象)
2、通用性问题:只能适应于 IoC 容器;如果将属性注入的代码移植到其他非 IoC 的框架中,那么代码就无效了,所以属性注入的通用性不是很好。
3、设计原则问题:更容易违背单一设计原则。因为属性注入比较简单,所以可能会出现滥用的情况,出现违背单一职责原则的概率也越大。
setter注入优缺点
1、不能注入不可变对象(final 修饰的对象);
2、注入的对象可被修改(因为提供了setter方法,所以很容易就可以修改)
构造方法注入的优缺点
1、注入不可变对象
2、注入对象不会被修改
构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。
3、可以保证注入对象完全被初始化
4、通用性更好
总结:为什么属性注入和setter注入都不可以注入一个不可变的对象?而构造方法却可以?因为在Java中,被final修饰的对象必须满足以下两个条件中的任意一个
final修饰的对象,要么直接赋值
final修饰的对象必须在构造方法中赋值