请举例说明@Qualifier 注解?

120 阅读1分钟

@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。