关于@Autowired的使用及注意事项
作者:JinF~
这篇文章主要介绍了关于@Autowired的使用及注意事项,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
@Autowired 注意事项
简单来说就是 在类型正确的前提下,先根据名字找,没找到时再根据类型找
例子如下:
如果容器中存在一个bean,这个bean的类型和id与被标注@Autowired的属性或者方法参数的类型和名称相同,那么此时的@Autowired相当于
@Autowired
@Qualifier("属性名")
例如:
存在一个接口TestInterface,有两个实现类分别是TestClass1和TestClass2都在spring容器中,此时有一个SomeClass类需要注入一个TestInterface属性
代码如下:
@Component
@Slf4j
public class SomeClass {
@Autowired
//这种方式会报错,因为存在两个TestInterface类型的bean
private TestInterface testInterface;
//不会报错,因为此时相当于
/*
@Autowired
@Qualifier("testClass1")
*/
@Autowired
private TestInterface testClass1;
public TestInterface getTestClass() {
return testClass1;
}
}
可以在某一个组件上加上@Primary,强制使用该类型,比如
@Component
@Primary
public class TestClass2 implements TestInterface {
private String s="testClass2";
public String getS() {
return s;
}
}
那么
@Autowired private TestInterface testClass1;
testClass1此时的类型是TestClass2
@Autowired放的位置
1.放在属性前,比如controller层调用service层,加在属性前不会调用set方法
@RestController
@RequestMapping("/student/card")
public class CardController {
@Autowired
CardService cardService;
}
2.放在set方法前,会通过调用set方法给属性赋值
@RestController
@RequestMapping("/student/card")
public class CardController {
CardService cardService;
@Autowired
public void setCardService(CardService cardService) {
this.cardService = cardService;
}
}
3.写在set方法的参数列表中:只能是@Bean的形式,(可以不写,会默认@Autowired),并且默认通过名字注入,相当于
public SomeClass someClass(@Autowired @Qualifier("card") Card card) @Bean
public SomeClass someClass(@Autowired Card card){
SomeClass someClass=new SomeClass();
someClass.setCard(card);
return someClass;
}
@Bean
public Card card(){
Card card=new Card();
card.setStudentId("01");
return card;
}
根据名字注入
同时使用@Autowired和@Qualifier("beanName")
@Autowired
@Qualifier("beanName")
private MybatisCardMapper mapper;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
