spring中,@Resource和@Autowired都是注入bean时使用。使用过程中,在接口仅有单一实现类时,两个注解修饰效果相同,课互相替换。
- @Resource是Java自己的注解,其有两个属性比较重要,分别是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略
- @Autowired时spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。
- 如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来实现。
一.接口仅有单一类实现时
Animal.java
public interface Animal {
String run();
}
Dog.java
@Service
public class Dog implements Animal {
@Override
public String run() {
return "狗会跑";
}
}
AnimalController.java
@RestController
@RequestMapping(value = "/run")
public class AnimalController {
@Resource
private Animal animal;
public String run(){
System.out.println(animal.run()+"------");
return animal.run();
}
}
2.接口多个类进行实现
添加Animal接口的实现类 Cat.java
@Service
public class Cat implements Animal {
@Override
public String run() {
return "猫会跑";
}
}
此时
AnimalController.java
(1) 解决办法
或则
给Cat实现类添加@Primary,此时
(2)下面是接口Animal拥有Dog和Cat两个实现类时,使用@Resource注解注入时的解决办法
第一种 解决办法
第二种解决办法
第三种
此时