何时在Spring中使用限定符和主对象

9w11ddsr  于 2022-11-28  发布在  Spring
关注(0)|答案(4)|浏览(131)

我已经读到@Qualifier可以用在注入阶段,而@Primary用在配置阶段。我仍然不清楚何时使用哪一个。
我也有下面的疑问

  • @Primary和@Qualifier可以一起使用吗?如果可以,@Qualifier是否优先?
  • @Primary可以与@Autowired一起使用吗?
  • 注入阶段与配置阶段有何不同,这与Springbean有关
zc0qhyus

zc0qhyus1#

@Primary表示当有多个候选项符合自动连接单值依赖关系的条件时,应优先选择Bean。
@Qualifier表示当有多个候选对象时,应自动连接特定Bean。
例如,我们有两个Bean都实现了相同的接口。

public interface BeanInterface {

    String getName();
}

public class Bean1 implements BeanInterface {
    @Override
    public String getName() {
        return "bean 1";
    }
}

public class Bean2 implements BeanInterface {
    @Override
    public String getName() {
        return "bean2";
    }
}

这是我们的服务。

@Service
public class BeanService {

    @Autowired
    private BeanInterface bean;
}

和我们的配置。

@Configuration
public class Config {

    @Bean("bean1")
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

当Spring启动时,它会发现有两个bean(“bean1”和“bean2”)都可以自动连接到BeanService,因为它们实现了相同的接口BeanInterface

Could not autowire. There is more than one bean of 'BeanInterface' type.
Beans: bean1   (Config.java) 
bean2   (Config.java)

如果没有提示,Spring不知道该使用哪一个。
在我们的例子中,当我们把@Primary加到Config.bean1()上时。

@Bean("bean1")
@Primary
public BeanInterface bean1() {
    return new Bean1();
}

它告诉Spring,“当您发现多个bean都可以自动连接时,请使用主bean作为您的第一个选择。”因此,Spring将选择bean1自动连接到BeanService
下面是另一种将bean1自动连接到BeanService的方法,方法是在BeanService.class中使用@Qualifier

@Service
public class BeanService {

    @Autowired
    @Qualifier("bean1")
    private BeanInterface bean;
}

@Qualifier会告诉Spring,“不管你找到了多少个bean,只要使用我告诉你的那个就行了。
因此,您可以发现@Qualifier@Primary都在告诉Spring在多个候选者都符合自动连接条件时使用特定的bean。但是@Qualifier更具体,并且具有高优先级。因此,当@Qualifier@Primary都被找到时,@Primary将被忽略。
下面是测试。

@Configuration
public class Config {

    @Bean("bean1")
    @Primary
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

@Service
public class BeanService {

    @Autowired
    @Qualifier("bean2")
    private BeanInterface bean;

    @PostConstruct
    public void test() {
        String name = bean.getName();
        System.out.println(name);
    }
}

输出为“bean2”。

k3fezbri

k3fezbri2#

此外,需要记住@Qualifier的优先级高于@Primary,这意味着定义这两个注解是浪费。
@Primary表示默认实现,而@Qualifier是具体实现。
您可以查看我写的关于此注解的博客-http://shaikezam.com/#/spring_qualifier

lnlaulya

lnlaulya3#

是,@限定符优先。是,我们可以同时使用@Primary和@Autowired。
@与应用程序上下文相关的配置类,可用于配置应用程序级配置。

mjqavswn

mjqavswn4#

要访问相同类型的bean,我们通常使用@Qualifier(“beanName”)注解。我们在注入点将其与@Autowired沿着应用。在我们的示例中,我们在配置阶段选择bean,因此@Qualifier不能在此处应用。
为了解决这个问题,Spring提供了@Primary注解沿着@Bean注解。
Source

相关问题