@Qualifier 注解在 Spring 框架中用于解决依赖注入时的歧义问题。当有多个相同类型的 Bean 存在时,Spring 无法确定应该注入哪个 Bean,这时可以使用 @Qualifier 注解来指定具体的 Bean。
示例
假设我们有一个 DatabaseConfig 类,其中定义了两个 DataSource Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DatabaseConfig {
@Bean
public DataSource primaryDataSource() {
// 配置主数据源
return new PrimaryDataSource();
}
@Bean
public DataSource secondaryDataSource() {
// 配置从数据源
return new SecondaryDataSource();
}
}
在这个例子中,我们有两个 DataSource Bean:primaryDataSource 和 secondaryDataSource。
使用 @Qualifier 注解
假设我们有一个 UserService 类,需要注入一个 DataSource。如果没有 @Qualifier 注解,Spring 会报错,因为它不知道应该注入哪个 DataSource。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
@Service
public class UserService {
private final DataSource dataSource;
@Autowired
public UserService(@Qualifier("primaryDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
// 其他业务逻辑
}
在这个例子中,@Qualifier("primaryDataSource") 注解明确指定了应该注入 primaryDataSource 这个 Bean。
另一个示例
假设我们有一个 DataAccessService 类,也需要注入一个 DataSource,但这次我们注入的是 secondaryDataSource。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
@Service
public class DataAccessService {
private final DataSource dataSource;
@Autowired
public DataAccessService(@Qualifier("secondaryDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
// 其他业务逻辑
}
在这个例子中,@Qualifier("secondaryDataSource") 注解明确指定了应该注入 secondaryDataSource 这个 Bean。