在Spring Boot中,如果存在不同包下面相同名称的Service类,例如:
// 包1下的服务实现
package com.example.service.impl;
@Service("userService1")
public class UserServiceImpl implements UserService {
// ...
}
// 包2下的服务实现
package com.example.another.impl;
@Service("userService2")
public class UserServiceImpl implements UserService {
// ...
}
假设有一个控制器需要注入其中一个UserService实例:
// 控制器类
package com.example.controller;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.Resource;
@RestController
public class UserController {
// 使用 @Autowired + @Qualifier 的方式注入指定的服务
@Autowired
@Qualifier("userService1") // 指定注入包1下的UserService
private UserService userService;
// 或者使用 @Resource 注入并指定name属性
@Resource(name = "userService2")
private UserService userService2;
// ...
}
通过上述代码示例可以看到:
?如果要通过@Autowired注入特定的服务,必须配合@Qualifier注解来明确指定Bean的名字(即对应的@Service注解上的值)。
?而使用@Resource时,可以通过设置其name属性为对应@Service注解的value,同样可以达到指定注入某个特定bean的目的。
总结来说,在有多个同名Service的情况下,单独使用@Autowired或不带name属性的@Resource是无法解决依赖注入问题的。需要通过额外的信息如@Qualifier或@Resource的name属性来区分不同的Bean。
#微头条首发挑战赛#
