专业的编程技术博客社区

网站首页 > 博客文章 正文

@Resource,@Autowired和@Service 注入和使用

baijin 2024-12-20 11:30:21 博客文章 7 ℃ 0 评论

@Resource注解

@Resource注解:是Java EE 5规范中定义的注解,可以用来注入任意的Java对象,包括EJB组件和其他JavaBeans。它可以通过name或type属性指定要注入的bean,也可以使用默认的属性名称进行注入。@Resource注解具有更广泛的兼容性,可以在各种容器中使用。

@Autowired注解

@Autowired注解:是Spring框架自带的注解,用于自动注入bean,可以用来注入一个或多个同类型的bean,也可以结合@Qualifier注解指定要注入的bean的名称。@Autowired注解的使用相对来说更简洁,但只能在Spring容器中使用。

@Service注解

@Service注解:是用于标记服务层组件的注解,通常与@Autowired注解一起使用。当Spring扫描到被@Service注解的类时,会将其实例化为一个bean,并注册到Spring的应用上下文中。使用@Service注解的好处是可以让代码更加清晰易读,并且便于维护

注解使用示例

新建一个动物接口

public interface Animal {
    void run();
}

创建两个实现类

@Service
public class Cat implements Animal{
    @Override
    public void run() {
        System.out.println("cat run");
    }
}
@Service
public class Dog implements Animal{
    @Override
    public void run() {
        System.out.println("dog run");
    }
}

属性注入方式

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

    @Resource
    private Map<String,Animal> map;

    @Resource
    private List<Animal> animals;

    @Autowired
    private Map<String,Animal> map1;

    @Autowired
    private List<Animal> animals2;
 
    @GetMapping("test")
    public String test()
    {
        for(String key:map.keySet())
        {
            map.get(key).run();
        }
        return "ceshi";
    }
}

此时map会包含两个显示类,key值分别为dog和cat,animals也包含两个实现类。如果使用如下方式进行注入,程序会报错

@Resource
private Animal animal;

@Autowired
private Animal animal1;

因为程序中有两个实现类,注入时没有指明具体的类。所以多实现时,要么使用集合一次性注入,要么在注入时指明具体的实现,如下

    @Resource(name = "dog")
    private Animal animal;

    @Qualifier(value = "cat" )
    @Autowired
    private Animal animal1;

如果想在注入时使用自定义名称,而不使用系统默认的名字。如在注入具体类时使用自定义名称,则可以在使用@Service注解时添加自定义名称即可如下

@Service(value = "china_cat")
public class Cat implements Animal{
    @Override
    public void run() {
        System.out.println("cat run");
    }
}
@Autowired 
@Qualifier(value = "china_cat") 
Animal animal;

构造函数注入

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

    private List<Animal> animals;
    private Map<String,Animal> map;
    private Animal animal;

    public TestController(List<Animal> animals,Map<String,Animal> map,
                          @Autowired @Qualifier(value = "cat") Animal animal)
    {
        this.animals=animals;
        this.map=map;
        this.animal=animal;
    }

    @GetMapping("test")
    public String test()
    {
        for(String key:map.keySet())
        {
            map.get(key).run();
        }
        return "ceshi";
    }
}

构造函数是通过@Autowired注解进行注入的,在构造函数中使用@Resource注解会报错

@Resource和@Autowired异同

@Resource和@Autowired都是Spring框架中用于进行依赖注入的注解,它们的作用类似,但有以下几个区别:

1.来源不同:@Resource是Java EE 5标准的注解,而@Autowired是Spring框架自带的注解。

2.注入方式不同:@Resource可以注入任意的Java对象,可以通过name或type属性指定要注入的bean,但如果没有指定,它会默认使用属性名作为bean的名称。而@Autowired默认按照类型注入bean,如果存在多个相同类型的bean,则可以通过@Qualifier注解指定bean的名称进行注入。

3.兼容性不同:@Resource注解在兼容性方面较为广泛,支持在各个容器中使用,包括EJB容器。而@Autowired注解则只能在Spring容器中使用。

4.可读性不同:@Autowired注解相对来说更加简洁,不需要指定name或type属性。而@Resource注解需要指定name或type属性,可能会显得略显冗长。

注意:IDEA中更推荐使用@Resource注解,当使用@Autowired注解时IDEA会用一个下划线提示

可能IDEA建议使用@Resource注解的原因主要是因为该注解在Java EE规范中被定义,具有更广泛的兼容性。与@Autowired注解相比,@Resource注解可以在各种容器中使用,包括EJB容器、Spring容器、Struts容器等。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表