java@Autowired注解问题

碰见一个很奇怪的问题,我不是很明白

我想静态代理新增一个类,我跟一个学习视频做。他在代理类中的@Component中加入了“userService”,因为控制层中的@Autowired会先去找这个名字,找不到userService名字,才会去找类型。
所以我也这样做去添加这个userService,但是我还是会根据类型找,也就是进入到userServiceImpl层中。后面我就在代理类中的@Component中变了一下,把值变成“userService1”,控制层的也变成userService1,这个时候才开始从名字开始找。这里我十分不解,还请各位未来java天花板指定一下

img


img


img

-------------------------------------- 这里我开始改变value值了--------------------------------------

img


img

以下内容部分参考ChatGPT模型:


首先需要明确的是,@Autowired注解是用来自动注入依赖的,它会根据类型(或名称)自动匹配需要注入的实例。因此,如果你在代理类中加入了“userService”的@Component注解,那么控制层中的@Autowired注解会自动注入这个userService实例。下面是一个示例代码:

@Component
public class UserService {
    // ...
}

@Component
public class MyProxy {
    @Autowired
    private UserService userService;
    // ...
}

@Controller
public class MyController {
    @Autowired
    private UserService userService;
    @Autowired
    private MyProxy myProxy;
    // ...
}

在上面的代码中,MyProxy类中的@Autowired注解会自动注入userService实例,而MyController中的@Autowired注解则会自动注入userService和myProxy实例。因为控制层中的@Autowired会先去找名字,所以如果你想指定注入的实例名称,可以使用@Qualifier注解。例如:

@Component("myUserService")
public class UserService {
    // ...
}

@Component
public class MyProxy {
    @Autowired
    @Qualifier("myUserService")
    private UserService userService;
    // ...
}

@Controller
public class MyController {
    @Autowired
    @Qualifier("myUserService")
    private UserService userService;
    @Autowired
    private MyProxy myProxy;
    // ...
}

这样就可以明确指定注入的实例名称了。希望这个回答能够帮到你。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

@Autowired是根据类型进行自动装配的

@Component注解是将类对象注入Context容器中,你给它设置value值就是给它定义名称,没有value就是类名首字母小写,详细看这个吧http://t.csdn.cn/Fjs9I

@Autowired 是根据类型查找,另外,做对照实验最重要的是保证变量唯一。对于第二种情况,你就算把变量改成private UserService user都能成功,因为跟变量名没一点关系。

看了下回答,基本是没跟着debug走过,

第一步,查找待选bean是根据type去筛选的,所以符合类型的bean会丢到一个map中

img


如果只有一个匹配bean的情况下,直接找到需要注入的bean(这里的else代码部分)

img


存在多个待选bean的情况下,才会去按名字推测,

img


请注意,此时绝对不是直接按照名字去找,如果用过primary注解的话,看到 primary估计一下就知道这里是干啥的,他这里优先匹配primary注解标记的bean

img


第二次会去实现Ordered注解的功能,如果配置了相关的优先级,也是会优先匹配的;

img


最后才是名称匹配

img