@Autowired注意事项:

简单来说就是 在类型正确的前提下,先根据名字找,没找到时再根据类型找

  • 例子如下:
  • 如果容器中存在一个bean,这个bean的类型和id与被标注@Autowired的属性或者方法参数的类型和名称相同,那么此时的@Autowired相当于
@Autowired
@Qualifier("属性名")
  • 例如存在一个接口TestInterface,有两个实现类分别是TestClass1TestClass2都在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;
}
  1. 放在set方法前,会通过调用set方法给属性赋值
@RestController
@RequestMapping("/student/card")
public class CardController {
    
    CardService cardService;
    
    @Autowired
    public void setCardService(CardService cardService) {
        this.cardService = cardService;
    }
}
  1. 写在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;
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐