自己注入自己

  1. public class UserService {
  2. private String name;
  3. public UserService(String name) {
  4. this.name = name;
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. @Autowired
  10. private UserService userService;
  11. public void test() {
  12. System.out.println(userService.getName());
  13. }
  14. }

然后针对UserService定义一个Bean:

  1. @Bean
  2. public UserService userService1() {
  3. return new UserService("userService1");
  4. }

按照正常逻辑来说,对于注入点:

  1. @Autowired
  2. private UserService userService;

会先根据UserService类型去找Bean,找到两个,然后根据属性名字“userService”找到一个beanName为userService的Bean,但是我们直接运行Spring,会发现注入的是“userService1”的那个Bean。

这是因为Spring中进行了控制,尽量“自己不注入自己”。

@Resource注解底层原理


Spring 依赖注入补充知识 - 图1

总结:

对于@Resource:

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