关于@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;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。