开发者

Spring中@Autowired和@Resource注解的使用区别详解

开发者 https://www.devze.com 2023-11-20 11:14 出处:网络 作者: Sterne_
目录1. @Autowired@Autowired的bean的匹配规则@Autowired的required属性2. @Resource@Resource的bean的匹配规则1. @Autowired
目录
  • 1. @Autowired
    • @Autowired的bean的匹配规则
    • @Autowired的required属性
  • 2. @Resource
    • @Resource的bean的匹配规则

1. @Autowired

@Autowired是由Spring提供的注解

@Autowired的bean的匹配规则

@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常。

  • @Autowired 默认是按照类的类型去匹配。如果存在一个相同类型的bean,则注入该bean。
  • 如果存在多个 bean,但只有一个 bean 拥有 @Primary 注解,则将带有 @Primary 注解的 bean 注入。@Primary 注解用于指定默认首选的 bean。
  • 如果存在多个 bean,可以使用@Qualifier注解,配合该注解指定bean的具体名称,根据名称去识别http://www.devze.combean。
  • 如果存在多个 bean,可以使用 List 或 S编程客栈et 数据结构来接收所有匹配的 bean。Spring 将自动将所有匹配的 bean 放入这些集合中。
  • 如果存在多个 bean,没有配合上述的方案,则将抛出 NoUniqueBeanDefinitionException 异常。

Spring中@Autowired和@Resource注解的使用区别详解

@Autowired的required属性

默认情况下,required = true,即依赖bean必须存在,如果不存在,则会抛出异常。但是,通过将required属性设置为false,则依赖bean不存在也不会报错。

Spring中@Autowired和@Resource注解的使用区别详解

2. @Resource

@Resource是Java EE规范的一部分,但Spring同样支持该注解。

@Resource的bean的匹配规则

默认根据name进行注入,如果无法通过名称匹配到对应的 Be编程客栈an 的话,会根据type进行匹配,找到与指定类型兼容的 Bean 并进行注入,如果都匹配不到则抛出异常。

使用 name 属性指定资源的名称

@Component
public class MyClass {
    // 名为 "myBean1" 的 bean 将会被注入
    @Resource(name = "myBean1")
    private MyBean myBean;
}

使用默认名称匹配资源

@Component
public class MyClass {
    // 名为“mybean”的bean将被注入
    @Resource
    private MyBean myBean;
}

根据type 属性来指定要注入的bean类型

public interface MyService {
    void fetchData();
}
@Component
public class MyServiceA implements MyService {
    public void fetchData() {
        System.out.println("from MyServiceA");
    }
}
@Component
public class MyServiceB implements MyService {
    public void fetchData() {
        System.out.println("from MyServiceB");
    }
}
@Component
public class DataProcessor {
    // 根据指定type注入myServiceA的bean
    @Resource(type = MyServiceA.class)
    private MyService myService;
    // 与上面效果相同注入myServiceA的bean
    @Resource
    private MyServiceA myServiceA;
    // 与上面效果相同注入myServiceA的bean
    @Resource
    private MyService myServiceA;
    // 与上面效果相同注入myServiceA的bean
    @Resource(name = "myServiceA")
    private MyService myService;
    // 注入bean失败,存在两个bean
    @Resource
    private MyService myService;
}

@Resource不存在re编程客栈quired属性

到此这篇关于Spring中@Autowirejsd和@Resource注解的使用区别详解的文章就介绍到这了,更多相关@Autowired和@Resource注解区别内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消