自动装配技术很常用,无论是面试还是工作都是有必要去了解一下,有点偏记忆的内容,各位慢慢积累吧。

一、结论

其实就是一种规则,但你有必要了解。

1.1、使用 @Autowired 时自动装配规则

@Autowired使用较多,由 Spring 框架提供的注解。

以如下代码为例,使用 @Autowired 注解会按照以下步骤进行自动装配。

  1. @Autowired
  2. private UserService userService;
  • 步骤一: 根据类型 UserService 在 Spring 容器中进行查找,如果能找到唯一一个满足要求的 Bean 则装配完成,如果未找到满足要求的 Bean 则抛出异常,如果找到多个满足条件的 Bean 则执行步骤二的逻辑。
  • 步骤二:根据字段名 userService 作为 Bean 的 id 在 Spring 容器中查找,如果能找到唯一一个满足要求的 Bean 则装配完成,如果未找到满足要求的 Bean 则抛出异常。注意一下我们不能找到多个满足条件的 Bean 因为同一个id 在Spring容器中最多有对应一个 Bean。

    1.2、使用 @Resource 时自动装配的规则

    使用偏少,由 J2EE 架构提供的注解。@Resource有两个重要的属性:name 和 type,而 Spring 将@Resource注解的 name 属性解析为 Bean 在 Spring 容器中的 id ,而 type 属性则解析为 Bean 在 Spring 容器中的类型。

以如下代码为例,使用 @Resouce 注解会按照以下步骤进行自动装配。

  1. @Resource
  2. private UserService userService;
  • 步骤一:如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 Bean 进行装配,找不到则抛出异常。
  • 步骤二:如果指定了 name,则从上下文中查找名称(id)匹配的 Bean 进行装配,找不到则抛出异常。
  • 步骤三:如果指定了 type,则从上下文中找到类似匹配的唯一 Bean 进行装配,找不到或是找到多个,都会抛出异常。
  • 步骤四:如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。