@Autowired 和 @Resource 细节问题

        这篇博客是我在学习 Spring 源码过程中的一个小小的总结,只为了个人记录以及后续学习。希望这篇博客对初学者有所帮助,也希望大神能够得到大神的指导。

依赖注入是经常使用到 @Autowired 和 @Resource 这两个注解(具体怎么使用,网上大堆)。

@AutoWried : 根据类型装配 bean,类型不存在时,根据 name 匹配

@Resource : 根据 name 匹配 bean 进行装配

@Autowried 可以根据属性名称自己装配,但是装配只能依据小驼峰的格式进行匹配

下面是测试代码和各种情况。

 

AppConfig.java

@Configuration
@ComponentScan("com.example.demo")
public class AopConfig {
}

Service.java

public interface Service {
    public void print();
}

CityService.java

@Component
public class CityService  implements Service {
    @Override
    public void print() {
        System.out.println("CityService");
    }
}

OrderService.java

@Component
public class OrderService implements Service{
    @Override
    public void print() {
        System.out.println("OrderService");
    }
}

情况1:

PersonService.java

@Component
public class PersonService {

    @Autowired
    private Service cityService;
    @Autowired
    private Service orderService;

    public void test1(){
        cityService.print();
    }
    public void test2(){
        orderService.print();
    }
}

test.java

//@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

//        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AopConfig.class);
//        CityService c1 = ac.getBean(CityService.class);
//        CityService c2 = ac.getBean(CityService.class);
//        System.out.println(c1 == c2);

        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AopConfig.class);
        PersonService p1 = ac.getBean(PersonService.class);
        p1.test1();
        p1.test2();
    }

}

运行结果:

由于 CityService 和 OrderService 都实现了 Service,因此在使用上述情况注入时,会自动映射到对应的 bean。

CityService
OrderService

情况2 :

在注入时 CityService 和 OrderService 都为大驼峰形式。

@Component
public class PersonService {

    @Autowired
    private Service CityService;
    @Autowired
    private Service OrderService;

    public void test1(){
        CityService.print();
    }
    public void test2(){
        OrderService.print();
    }
}

运行结果:

程序会自动报错。

 

原因:

Spring 的容器(IOC),可以理解成 Map<String,Object> 对象(虽然这么理解不合适,目前可以这么理解)。因为Spring 自动装配 bean 时,会以对应 类小驼峰的名称为key 和 对应的 bean 为 value 存放在 singletonObjects(单例池) 对象中。getBean 时会以对应类的小驼峰为 key 从 singletonObjects 对象中直接获取。由于在这种情况下 CityService 和 OrderService 为 大驼峰形式,因此获取不到报错。

 

 

 

情景3:

@Component
public class PersonService {

    @Resource(name = "orderService")
    private Service cityService;
    @Autowired
    private Service orderService;

    public void test1(){
        cityService.print();
    }
    public void test2(){
        orderService.print();
    }
}

运行结果:

虽然时 cityService,但是@Resource(name = "orderService") 指定了 bean 的名称

OrderService
OrderService

注意:当 @Resource(name = "OrderService") 为大驼峰格式时,依旧会报错。

 

### 回答1: `@Autowired` 和 `@Resource` 都是用来完成 Java 对象之间的依赖注入(Dependency Injection)的注解。但是它们之间有一些差异: 1. 注解来源:`@Autowired` 是 Spring 框架中的注解,而 `@Resource` 是 Java 标准库中的注解。 2. 默认按照名称匹配:`@Autowired` 默认按照类型进行匹配,如果存在多个相同类型的对象,则会抛出异常。而 `@Resource` 默认按照名称进行匹配,如果没有指定名称,则会按照类型进行匹配。 3. 是否支持按照名称匹配:`@Autowired` 可以通过添加 `@Qualifier` 注解来指定名称进行匹配,而 `@Resource` 可以直接通过指定名称进行匹配。 总的来说,如果您正在使用 Spring 框架,建议使用 `@Autowired`;如果不是,则建议使用 `@Resource`。 ### 回答2: @Autowire和@Resource是在Spring框架中用于实现依赖注入的注解,并且在用法和作用上有一些区别。 @Autowire是Spring提供的注解之一,用于将类中需要依赖的对象自动注入到对应的字段、方法或构造函数中。它可以根据类型进行自动装配,并且默认将找到的依赖对象注入到对应的字段上,如果存在多个匹配的依赖对象,Spring会尝试根据字段名来推断匹配的依赖对象。此外,@Autowire还支持通过@Qualifier注解来指定具体使用哪个实现类,从而解决多个匹配依赖对象的问题。 @Resource也是Spring提供的注解之一,同样用于实现依赖注入的功能。不同于@Autowire,@Resource在注入依赖对象时,可以根据字段的名称或者指定名称来匹配依赖对象。它可以通过@Resource(name="name")来指定明确的依赖对象,或者使用默认的名称匹配方法,默认会根据字段名称来进行匹配。 总的来说,@Autowire和@Resource的作用类似,都是实现依赖注入,但在用法上有一些区别。@Autowire更加简洁,只需要在需要注入依赖对象的字段上添加注解,并且可以通过@Qualifier指定具体的实现类。而@Resource则更加灵活,可以根据字段名称或指定名称来匹配依赖对象。在实际使用中,可以根据具体的需求来选择合适的注解来实现依赖注入。 ### 回答3: @Autowire和@Resource都是用来实现依赖注入的注解,它们的作用相似,但在一些细节上有一些不同之处。 首先,它们的使用方式有所不同。@Autowire是Spring框架提供的注解,用于自动装配bean对象,它可以用在属性、构造方法、setter方法、普通方法上。而@Resource是JavaEE提供的注解,用于指定bean的名称进行依赖注入,它默认通过名称进行匹配,也可以通过name属性指定名称。 其次,它们对于错误处理的方式也有所不同。@Autowire在进行依赖注入时,如果找不到对应的bean,则会抛出异常,表示自动装配失败。而@Resource在进行依赖注入时,如果找不到对应的bean,则会尝试按照名称进行装配,如果仍然失败,则会抛出异常。 此外,它们对于注入的方式也有所不同。@Autowire注解是通过byType进行自动装配的,如果存在多个与属性类型兼容的bean,则会根据bean的名称进行选择。而@Resource注解默认是通过byName进行装配的,根据名称进行匹配,如果名称无法匹配,则通过byType匹配。 另外,@Autowire是Spring框架提供的,所以它的使用范围更广,不仅限于JavaEE应用,还可以用于Spring框架的其他组件。而@Resource是JavaEE提供的注解,所以它的使用范围相对较窄,主要应用于JavaEE相关的应用和服务器端开发。 综上所述,@Autowire和@Resource都是用于实现依赖注入的注解,它们的使用方式、错误处理方式、注入方式以及使用范围等方面有所不同。在具体使用时,需要根据具体情况选择合适的注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值