如果一个程序中有多个bean,再使用自动装配就会出现歧义性,Spring容器就不知道到底装配哪一个,下面介绍一下解决自动装配的歧义性的方法:
一、使用首选bean
使用首选bean的注解是:@Primary,只需要在声明类的时候使用@Primary就行,不过要注意的是,只能定义一个@Primary
二、使用限定符
使用限定符的注解是:@Qualifier(),只需要在声明的时候和装配的时候使用@Qualifier()就行
三、使用限定符和bean id
在声明的时候指定bean的id(默认的id是首字母小写的类名),在装配的时候使用@Qualifier()
四、使用Java标准解决
使用Java标准解决就是使用Java反射机制,只需要加@Resource(name="id"),使用Java标注的话,就不需要加@Autowired了
pom配置:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.19.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
下面贴出代码:
public interface UserService {
void add();
}
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.qfedu.demo.service.UserService;
//@Component("festival")
//@Primary
//@Qualifier("festival")
@Component
public class UserServiceFestival implements UserService {
public void add() {
System.out.println("注册用户并赠送优惠券!");
}
}
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.qfedu.demo.service.UserService;
//@Component("normal")
//@Qualifier("normal")
@Component
public class UserServiceNormal implements UserService {
public void add() {
System.out.println("添加用户成功!");
}
}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.qfedu.demo.serviceImpl")
public class AppConfig {
}
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
//@PropertySource("classpath:/log4j.properties")
public class UserServiceTest {
@Autowired
//@Qualifier("festival")
@Qualifier("userServiceNormal")
// @Resource(name="userServiceNormal")
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}