Spring依赖注入的注解使用区别

在Spring中不仅支持自已定义的@Autowired注解,还支持由J2EE提供的@Resource注解进行依赖注入,都是用来装配Bean的注解。都可以写在字段上,或写在setter方法上。

 @Resource(name = "cat")
    private Animal animal;
    @Autowired
    public void setName(String name) {
        this.name = name;
    }

两个注解的区别是:
@Autowired默认按类型装配依赖对象。我们用@Autowired为接口的实例对象进行注解,它会到Spring容器中去寻找与实例对象相匹配的类型,如果找到该类型则将该类型注入到字段中。
1、默认情况下,它要求依赖对象必须存在,如果为空,就会抛出异常。如果允许依赖对象的注入为null,可以设置required属性为false。
例如:

@Component("dog")
public class Dog implements Animal{
    @Autowired
    private String name;
    public void eat() {
        System.out.println(name+"小狗吃");
    }
}

默认时,抛出异常:
在这里插入图片描述
当设置了required 为false的时候,就允许依赖注入的对象为null

@Component("dog")
public class Dog implements Animal{
    @Autowired(required = false)
    private String name;
    public void eat() {
        System.out.println(name+"小狗吃");
    }
}

在这里插入图片描述
2、当注入的是一个接口,而且有两个实现类,就会抛出异常。

//接口类
@Component("animal")
public interface Animal {
    public void eat();
}
//实现类1
@Component("dog")
public class Dog implements Animal{
    public void eat() {
        System.out.println("小狗吃");
    }
}
//实现类2
@Component("cat")
public class Cat implements Animal {
    public void eat() {
        System.out.println("小花猫吃");
    }
}
//注入接口的类
@Component("test")
public class TestDemo1 {
    @Autowired
    private Animal animal;
    public void fun(){
        animal.eat();
    }
}

当运行之后,就抛出了异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'test': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cj.bean.Animal com.cj.bean.TestDemo1.animal; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.cj.bean.Animal] is defined: expected single matching bean but found 2: cat,dog

而 Qualifier和Autowired配合使用,指定bean的名称,如
@Autowired
@Qualifier(“cat”)
就可以运行成功
在这里插入图片描述
@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。如果用@Resource进行依赖注入,它先会根据指定的name属性去Spring容器中寻找与该名称匹配的类型,如果没有找到该名称,则会按照类型去寻找,找到之后,会对字段进行注入。

可以不再使用之前的注解
@Autowired  
@Qualifier("cat")  
而可以使用 @Resource(name = "cat")

注:如果没有指定name属性,并且按照默认的名称仍找不到对象时,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
总结:
1、最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
2、如果@Requied或者@Autowired写了set方法之上,则程序会走到set方法内部。但如果写在了field之上,则不会进入set方法当中。
通常我们都是会使用@Resource注解进行依赖注入的。
使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护。
3、我喜欢用 @Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值