创建接口UserDao
/**
* @Author 喜欢编程的夏先生
* @Date 2022-06
*/
public interface UserDao {
void add();
}
创建两个实现了接口UserDao的实现类
@Repository
public class UserDao1 implements UserDao {
@Override
public void add() {
System.out.println("userDao1's add......");
}
}
@Repository
public class UserDao2 implements UserDao {
@Override
public void add() {
System.out.println("userDao2's add......");
}
}
创建UserService类并注入UserDao
@Service
public class UserService {
@Autowired
private UserDao userDao1;
public void insert(){
System.out.println("userService's insert......");
userDao1.add();
}
}
创建测试方法
@Test
public void test1(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig1.class);
UserService service = applicationContext.getBean(UserService.class);
service.insert();
}
运行结果
上面我们可以看到,我们在UserService里面注入了UserDao的对象。并且这个对象的名字叫userDao1,此时容器会根据名字与第一个UserDao的实现类也就是UserDao1进行匹配。如果我们在UserService里面的UserDao对象的名字修改为UserDao2,那么对象就会与UserDao2进行匹配且运行结果如下
使用@Qualifier指定与之匹配的对象
@Service
public class UserService {
@Autowired
@Qualifier("userDao2")
private UserDao userDao1;
public void insert(){
System.out.println("userService's insert......");
userDao1.add();
}
}
运行测试类结果如下
使用@Primary注解指定优先级
我们可以在UserDao2上加入注解@Primary
修改Service如下
运行测试方法输出如下
当然了,当我们使用了@Primary注解的时候,我们也可以再使用 @Qualifier来指定
使用@Resource和@Inject注入属性
@Resource注解和@Inject注解属于Java的,上面的注解是使用Spring的。
修改UserService中的注解。我们看到此时的属性名为userDao,而我们的UserDao2上有@Primary注解,因此此时注入的时UserDao2的对象。
如果我们代码是下面这样的话
那么不管有没有@Primary注解,容器都会根据名字进行分配,即注入的对象为UserDao1的对象。
当然了,我们可以通过如下形式来指定名字。
如果想使用@Inject注解来注入对象首先你得先加入如下的pom依赖
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
功能都是类似的,这里就不再赘述。