Spring框架中的@Primary注解详解与实例
在Spring框架中,当我们遇到多个bean实现同一个接口时,Spring的自动装配机制可能会感到困惑,不知道应该选择哪一个bean进行注入。在这种情况下,我们可以使用@Qualifier
注解来指定注入哪一个具体的bean。但是,有时候我们可能不希望或不能在注入点使用@Qualifier
,比如我们没有权限修改bean的类定义。这时,@Primary
注解就派上用场了。
@Primary注解的作用
@Primary
注解用于指示在多个候选bean中,哪一个bean应该被优先考虑进行自动装配。如果存在一个带有@Primary
注解的bean,那么Spring将自动选择这个bean进行注入,而无需使用@Qualifier
。
实例演示
接下来,我们将通过一个简单的例子来演示如何使用@Primary
注解解决自动装配的歧义问题。
定义接口和实现
首先,我们定义一个Dao
接口及其两个实现类DaoA
和DaoB
。
package com.logicbig.example;
public interface Dao {
void saveOrder(String orderId);
}
public class DaoA implements Dao {
public void saveOrder(String orderId) {
System.out.println("DaoA Order saved " + orderId);
}
}
public class DaoB implements Dao {
@Override
public void saveOrder(String orderId) {
System.out.println("DaoB Order saved " + orderId);
}
}
创建服务类
然后,我们创建一个OrderService
服务类,该类需要注入Dao
接口的实现。
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
public class OrderService {
@Autowired
private Dao dao;
public void placeOrder(String orderId) {
System.out.println("placing order " + orderId);
dao.saveOrder(orderId);
}
}
配置Spring应用上下文
最后,我们配置Spring应用上下文,定义OrderService
和两个Dao
的bean,并使用@Primary
注解指定优先使用的Dao
实现。
package com.logicbig.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class AppConfig {
@Bean
public OrderService orderService() {
return new OrderService();
}
@Bean
public Dao daoA() {
return new DaoA();
}
@Primary
@Bean
public Dao daoB() {
return new DaoB();
}
public static void main(String[] args) {
// 省略获取ApplicationContext和调用placeOrder方法的代码
}
}
运行结果
当我们运行上述代码时,由于DaoB
被标记为@Primary
,Spring将自动选择DaoB
进行注入,输出结果将是:
placing order 122
DaoB Order saved 122
版本兼容性
本例使用的Spring版本为6.1.2,与Spring Context的3.2.3.RELEASE至6.1.2版本兼容。Java版本要求为17或更高。
技术栈
- Spring Context: 6.1.2
- JDK: 17+
- Maven: 3.8.1
通过这个例子,我们可以看到@Primary
注解在处理Spring框架中自动装配歧义时的实用性。希望这个博客能够帮助你更好地理解和使用@Primary
注解。