@Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。
下面我们来看一下@Autowired注解的源码,如下所示。
说明:
applicationContext.getBean(类名.class);
applicationContext.getBean("组件的id");
@Autowired是根据类型进行自动装配的,如果需要按照名称进行装配,那么就需要配置@Qualifier注解来使用了。
下面我们来看一下@Qualifier注解的源码,如下所示。
在Spring中使用注解时,常常会使用@Autowired注解,它默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口而言,可能会有几种不同的实现类,而在默认只会采取其中一种实现的情况下,就可以使用@Primary注解来标注优先使用哪个实现类。
下面我们来看一下@Primary注解的源码,如下所示。
在进行项目实战之前,我们先来说说什么是Spring组件的自动装配。Spring组件的自动装配就是Spring利用依赖注入,也就是我们通常所以说的DI,完成IOC容器中各个组件的依赖关系复杂。
在Spring中,对同一个接口而言,可能会有几种不同的实现类,而默认只会采用其中一种实现的情况下,就可以使用@Primary注解来标注优先使用哪个实现类。
@Primary相当于在一个接口多个实现类的情况下,默认注入的类型。
如果IOC容器中相同类型的组件有多个,那么我们不可避免的就要来回用@Qualifier注解来指定要装配哪个组件,这还是比较麻烦的,Spring正是帮我们考虑到了这样一种情况,就提供了这样一搞比较强大的注解@Primary。我们可以利用这个注解让Spring进行自动装配的时候,默认使用首选的bean。
首先,我们在MainConfigOfAutowired配置类的bookDao()方法上添加上@Primary注解,如下所示。
package com.meimeixia.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.meimeixia.dao.BookDao;
@Configuration
@ComponentScan({"com.meimeixia.service", "com.meimeixia.dao", "com.meimeixia.controller"})
public class MainConfigOfAutowired {
@Primary
@Bean("bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
注意:此时,我们需要注释掉BookService类中bookDao字段上的@Qualifier注解,这是因为@Qualifier注解为显示指定装配哪个组件,如果使用了@Qualifier注解,无论是否使用了@Primary注解,都会装配@Qualifier注解标注的对象。
package com.meimeixia.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.meimeixia.dao.BookDao;
@Service
public class BookService {
// @Qualifier("bookDao") // 要让首选装配起效果,@Qualifier自然就不能用了
@Autowired
private BookDao bookDao;
public void print() {
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
那我们非要装配bookDao,可不可以呢?当然可以了,我们只须使用@Qualifier(“bookDao”)来显示指定装配bookDao即可。也就是说如果是在没有明确指定的情况下,那么就装配优先级最高的首选的那个bean,如果是在明确指定了的情况下,那么自然就是装配指定的那个bean了。
因此,我们可以为BookService类中的bookDao字段再次添加@Qualifier注解,如下所示。
package com.meimeixia.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.meimeixia.dao.BookDao;
@Service
public class BookService {
@Qualifier("bookDao")
@Autowired(required=false)
private BookDao bookDao;
public void print() {
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
[Spring注解驱动开发第20讲——使用@Autowired、@Qualifier、@Primary这三大注解自动装配组件,你会了吗?(https://liayun.blog.csdn.net/article/details/110492582)