用实例证明@Autowired和@Resource注解先通过Type还是Name注入

注:本文中所有的“@Autowired和@Resource注入的先手顺序”一词都是指两个注解类是先通过Type注入还是先通过Name注入,并非是指两个注解在spring中执行的先后顺序

最近听子路老师讲课,课上讲解关于@Autowired和@Resource是先通过type还是先通过name注入属性的知识有点心得。

子路老师从源码的角度给大家讲了两个注解的先后顺序,但是如何通过应用的层面来进行验证呢?经过一番思考,想到了一种情况可以证明,分享给大家

1、创建一个FeiyangConfig配置类,添加扫描注解

@Configuration
@ComponentScan("com.feiyang")
public class FeiyangConfig {
}

2、创建一个Zilu类和Feiyang类并交给spring容器管理

@Component
public class Zilu {
}
@Component
public class Feiyang {
}

3、创建一个Luban类,为该类添加Zilu feiyang和Feiyang zilu属性并添加@Autowired注解,提供一个打印两个属性的方法@Component

@Component
public class Luban {

    @Autowired
    private Feiyang zilu;

    @Autowired
    private Zilu feiyang;

    public void print() {
        System.out.println("Feiyang zilu = " + zilu);
        System.out.println("Zilu feiyang = " + feiyang);
    }

}

4、新建一个测试类,初始化spring容器,获取Luban bean,调用打印方法

public class Test {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(FeiyangConfig.class);
        ac.getBean(Luban.class).print();
    }

}

5、运行代码,可以看到控制台打印信息

Feiyang zilu = [email protected]
Zilu feiyang = [email protected]

得出结论:@Autowired是先通过Type注入,后通过Name注入的。因为如果是先通过Name注入,那么Feiyang zilu注入的就应该是Zilu bean,而Zilu bean注入给Feiyang类型的属性必定会报错,所以不可能是先通过Name注入,只能是先通过Type注入的。
6、将两个属性的@Autowired注解修改为@Resource注解

@Component
public class Luban {

    @Resource
    private Feiyang zilu;

    @Resource
    private Zilu feiyang;

    public void print() {
        System.out.println("Feiyang zilu = " + zilu);
        System.out.println("Zilu feiyang = " + feiyang);
    }

}

由于@Resource是先通过Name注入的,所以初始化spring的时候一定会报错。为了验证结果,我们重复一遍4的步骤,控制台打印信息如下

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘luban‘: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘zilu‘ is expected to be of type ‘com.feiyang.model.Feiyang‘ but was actually of type ‘com.feiyang.model.Zilu‘Error creating bean with name ‘luban‘: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘zilu‘ is expected to be of type ‘com.feiyang.model.Feiyang‘ but was actually of type ‘com.feiyang.model.Zilu‘

这个报错信息的意思是创建Luban这个bean的时候失败,失败原因是注入名称为zilu的bean的时候应该是注入一个Feiyang类型的bean,但是获取到的却是Zilu类型的bean,这就说明@Resource是先通过Name注入的

总结:@Autowired和@Resource注入的先后顺序的结果大家都是知道的,本次只是通过应用的层面来侧面证明一下,以后有机会可以从源码角度和大家分享一下它们注入的先后顺序

原文地址:https://www.cnblogs.com/big-feiyang/p/11640929.html

时间: 2024-10-01 07:01:47

用实例证明@Autowired和@Resource注解先通过Type还是Name注入的相关文章

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

@Autowired和@Resource注解的区别?

谈到Spring的注解,@Autowired和@resource这两个注解不得不提.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上 那@Autowired和@resource注解的区别是什么? [email protected]是spring的注解,它的jar包在import org.springframework.beans.factory.annotation.Autowired.而@resource是属于java的,它的jar包

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的

本文介绍了使用spring注解注入属性的方法. 使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现. 使用注解以前我们是怎样注入属性的 类的实现: 1. public class UserManagerImpl implements UserManager { 2. private UserDao userDao; 3. public v

关于@Autowired和@Resource注解区别

区分一下@Autowired和@Resource两个注解的区别: 1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配 2.@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了 Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合. @Service("StudentSer

spring装配之 @Autowired 和 @Resource 注解的区别

@Autowired @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired.@Autowired采取的策略为按照类型注入. @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@

深入探索spring技术内幕(四): 剖析@Resource注解实现原理与注解注入

一.@Resource注解原理 @Resource可以标注在字段或属性的setter方法上 1.  如果指定了name属性, 那么就按name属性的名称装配; 2. 如果没有指定name属性, 那就按照默认的名称查找依赖对象; 3. 如果按默认名称查找不到依赖对象, 那么@Resource注解就会回退到按类型装配; ① 先写一个自己的@MyResource: import java.lang.annotation.Retention; import java.lang.annotation.Re

@Resource注解

@Resource 注解被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象. Spring确实支持使用@Resource通过JNDI lookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的“bean name(bean名字)”的Spring管理对象会被注入. 在下面的例子中,Spring会向加了注解的setter方法传递bean名为“dataSource”的Spring

用@Resource注解完成属性装配

使用Field注入(用于注解方式):注入依赖对象可以采用手工装配或者手工自动装配.在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 依赖注入—手工装配 手工装配依赖对象,在这种方式中又有两种编程方式. 1.在xml配置文件中,通过bean节点配置,如: 1 <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> 2 //构造器注入 3

@Resource注解(转)

@Resource 注解被用来激活一个命名资源(namedresource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象.Spring确实支持使用@Resource通过JNDIlookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的“beanname(bean名字)”的Spring管理对象会被注入.在下面的例子中,Spring会向加了注解的setter方法传递bean名为“dataSource”的Spring管理对象的