1. 引子
平时依赖注入用的最多的是Autowired注解,实际上除了可以使用Spring提供的@Autowired和@Qualifier来标注相应类定义之外,还可以使用Jdk自带的@Resource和@PostConstruct以及@PreDestroy对相应类进行标注,这同样可以达到依赖注入的目的。 @Resource与@Autowired不同,它遵循的是byName自动绑定形式的行为准则,也就是说,IoC容器将根据@Resource所指定的名称,到容器中查找beanName与之对应的实例,然后将查找到的对象实例注入给@Resource所标注的对象。 下面通过示例来了解一下。
2. 示例
首先定义一个Car接口:
public interface Car {
public String print();
}
然后基于这个接口定义两个实现类:
@Component
public class Audi implements Car {
@Override
public String print(){
return "audi";
}
}
写好之后,我们可以使用Autowired注解来注入这个car:
@RestController
public class TestController {
@Autowired
private Car car;
...
}
但是如果该接口有两个实现类呢,下面再加一个奔驰:
@Component
public class Benz implements Car {
@Override
public String print(){
return "benz";
}
}
这时注入就会报错了,原因在Qualifier注解那篇文章中已经提到了,我们可以使用Qualifier注解来指定使用哪一个实现类。本文用到了另一个Resource注解,也可以解决这个问题:
@RestController
public class TestController {
@Resource(name="audi")
private Car car;
...
}
使用该注解的时候,可以通过参数name来指定注入哪一个实现类。如果没有指定name的值,那么和只使用Autowired注解的效果是一样的。
总的来说,这个Jdk提供的Resouce注解和Spring提供的Autowired+Qualifier注解效果差不多。
网友评论