自己注入自己
public class UserService {private String name;public UserService(String name) {this.name = name;}public String getName() {return name;}@Autowiredprivate UserService userService;public void test() {System.out.println(userService.getName());}}
然后针对UserService定义一个Bean:
@Beanpublic UserService userService1() {return new UserService("userService1");}
按照正常逻辑来说,对于注入点:
@Autowiredprivate UserService userService;
会先根据UserService类型去找Bean,找到两个,然后根据属性名字“userService”找到一个beanName为userService的Bean,但是我们直接运行Spring,会发现注入的是“userService1”的那个Bean。
这是因为Spring中进行了控制,尽量“自己不注入自己”。
@Resource注解底层原理

总结:
对于@Resource:
- 如果@Resource注解中指定了name属性,那么则只会根据name属性的值去找bean,如果找不到则报错
- 如果@Resource注解没有指定name属性,那么会先判断当前注入点名字(属性名字或方法参数名字)是不是存在Bean,如果存在,则直接根据注入点名字取获取bean,如果不存在,则会走@Autowired注解的逻辑,会根据注入点类型去找Bean
