@Autowired详解与注意事项
@Autowired注意事项:如果容器中存在一个bean,这个bean的类型与id与被标注@Autowired的属性或者方法参数的类型与名称相同,那么此时的@Autowired相当于@Autowired@Qualifier("属性名")例如存在一个接口TestInterface,有两个实现类分别是TestClass1和TestClass2都在spring容器中,此时有一个SomeClass类需要注
·
@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
放的位置
- 放在属性前,比如
controller
层调用service
层,加在属性前不会调用set
方法
@RestController
@RequestMapping("/student/card")
public class CardController {
@Autowired
CardService cardService;
}
- 放在
set
方法前,会通过调用set
方法给属性赋值
@RestController
@RequestMapping("/student/card")
public class CardController {
CardService cardService;
@Autowired
public void setCardService(CardService cardService) {
this.cardService = cardService;
}
}
- 写在
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;
更多推荐
已为社区贡献1条内容
所有评论(0)