依赖注入(Dependency Injection, DI)和IoC,作为Spring的核心,Spring中的一切对象都被IoC容器托管,当一个对象需要使用另一个对象中的方法时,可以通过注入的方式,而不是通过手动创建来使用,有几种注入方式。

字段注入

最常用,最简单的一种方式。在类属性上添加@Autowired或者@Resource注解,实现对象的注入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class AggregateService {

@Autowired
@Qualifier(value = "serviceOne")
private ServiceOne serviceOne;

@Resource(name = "serviceTwo")
private ServiceTwo serviceTwo;

public void queryOne() {

}
}

两个注解的区别:

  1. @Autowired是首先根据对象的类型去查找bean,如果是接口,可能有多个相同类型的实现,则可以与Qualifier组合使用,指定名称查找;
  2. @Resource则会首先根据对象的名字去查找,查找不到则再根据类型查找,name指定具体的名字。

set方法注入

官方不提倡Field注入的方式,使用的话会出现如下的提示:

这时可以使用set方法上注入。

1
2
3
4
@Autowired
public void setServiceOne(ServiceOne serviceOne) {
this.serviceOne = serviceOne;
}

构造方法注入

构造方法中,将需要使用的对象作为构造参数传递。

1
2
3
4
public AggregateService(ServiceOne serviceOne, ServiceTwo serviceTwo2) {
this.serviceOne = serviceOne;
this.serviceTwo2 = serviceTwo2;
}

这种方法的缺点很多,当需要注入的对象很多的时候,构造函数的参数也会变多,代码不整洁。