其他分享
首页 > 其他分享> > @Autowired与@Resource的区别

@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 +"注解注入成功!");
    }
}

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

 使用@Autowired注解

运行后报错

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

先给service实现类设置别名

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

 运行后发现调用成功

 使用@Resource注解

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

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

 总结

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

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

 

标签:Resource,区别,Autowired,TestService,注解,type,public
来源: https://blog.csdn.net/qq_37634156/article/details/120720566