@Resource
是Java EE提供的注解,也可以在Spring中使用。它是按照名称进行注入的,默认通过属性名(通常是类名的小驼峰命名方式)或者name
属性来匹配。如果找不到符合名称的bean,则会抛出异常。在使用时可以指定 name
属性来明确指定要注入的bean的名称,也可以通过 type
属性来指定要注入的bean的类型。 示例:
假设有一个叫做 SomeBean
的类:
@Component
public class SomeBean {
? ?// ...
}
使用 @Resource
注解来注入该类的实例时,可以直接在需要注入的属性上使用 @Resource
注解,属性名会被默认匹配到对应的bean:
@Component
public class AnotherBean {
? ?@Resource
? ?private SomeBean someBean;
? ?// ...
}
但需要注意以下问题:
命名不一致:如果属性名与bean的名称不一致,将无法正确匹配到对应的bean,会抛出异常。此时可以通过指定 name
属性来明确指定要注入的bean的名称。
@Component
public class AnotherBean {
? ?@Resource(name = "otherName")
? ?private SomeBean someBean;
? ?// ...
}
我们使用 @Resource
注解的 name
属性指定了要注入的 bean 的名称为 "otherName"。因此,Spring 会在容器中查找名称为 "otherName" 的 bean,并将其注入到 AnotherBean
类的 someBean
属性中
多个匹配项:如果存在多个符合类型的bean,且都符合属性名匹配规则,会抛出异常。此时可以通过指定 name
属性来明确指定要注入的bean的名称,或者结合 @Qualifier
注解使用。
举个例子,假设有两个名为 someBean1
和 someBean2
的 bean:
@Component("someBean1")
public class SomeBean {
? ?// ...
}
?
@Component("someBean2")
public class AnotherBean {
? ?// ...
}
?
@Component
public class YetAnotherBean {
? ?@Autowired
? ?@Qualifier("someBean1")
? ?private SomeBean someBean;
? ?// ...
}
@Qualifier
注解中的值应该是要注入的 bean 的名称或标识符,而不是属性名或类名。
@Autowired是Spring框架提供的注解,在Spring中广泛应用。它默认按照类型进行注入,通过匹配对象类型来实现自动装配。如果存在多个匹配的bean,可以使用 @Qualifier
注解结合 @Autowired
来指定具体的bean名称进行注入。 示例:
@Autowired
private SomeBean someBean;
@Autowired
是非必须的,如果找不到匹配的Bean,Spring容器仍然会正常启动。@Resource
是必须的,如果找不到匹配的Bean,会抛出异常。@Autowired
注解。因为 Spring Boot 默认集成了 Spring 框架,并做了一些自动配置,@Autowired
可以更好地适应和利用 Spring Boot 的特性。此外,@Autowired
的语义也更加清晰和直观。因为它是 Spring 提供的原生注解,而且更加灵活。@Resource
。