栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Autowired与@Resource的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Autowired与@Resource的区别

@Autowired是spring的注解,@Resource是j2ee的注解,他们的作用都是用于注入

1、通用场景

首先创建一个service类

public interface TestService {

    void injectionTest(String type);
}
@Service
public class TestServiceImpl implements TestService {

    @Override
    public void injectionTest(String type) {
        System.out.println("方法被调用,"+ type +"注解注入成功!");
    }
}

然后在控制层创建调用方法,首先使用@Autowired注解

@RestController
@RequestMapping("/test")
public class TestController {

    private static Logger logger = LoggerFactory.getLogger(TestController.class);

    @Autowired
    private TestService testService;


    @GetMapping("/myTest")
    public void test(String type){
        testService.injectionTest(type);
    }
}

运行后发现正常运行

 改成@Resource注解再次运行该方法

@RestController
@RequestMapping("/test")
public class TestController {

    private static Logger logger = LoggerFactory.getLogger(TestController.class);

    @Resource
    private TestService testService;


    @GetMapping("/myTest")
    public void test(){
        testService.injectionTest();
    }
}

 可以发现这种情况下@Autowired注解与@Resource注解并无区别。

2、一个业务接口对应两个或多个业务实现类

新建一个TestNewServiceImpl实现TestService,如下所示

@Service
public class TestNewServiceImpl implements TestService {

    @Override
    public void injectionTest(String type) {
        System.out.println("方法被调用,"+ type +"注解注入成功!");
    }
}

这时候有两个业务实现类都实现了TestService接口

 使用@Autowired注解

运行后报错

 报错信息显示很明确,有两个业务实现类,系统不知道该选择哪一个,这时候需要使用@Qualifier注解来指定所选的业务实现类,如下:

先给service实现类设置别名

然后@Qualifier按照设置的别名指定所选的业务实现类

 运行后发现调用成功

 使用@Resource注解

删除设置的别名后运行发现同样报错

 恢复设置的别名,然后@Resource注解同样指定别名后运行

 总结

 @Autowired是根据类型(byType)注入的,然后当找到type类型的bean时,如果发现有异常(不唯一等),会再去根据name去找bean注入。

@Resource默认byName去找bean,还提供了name和type一起设置或者单一设置

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号