ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自动装配(@Autowired和@Resource的区别)

2021-11-10 23:04:05  阅读:135  来源: 互联网

标签:装配 Resource Autowired cat bean 匹配 public 属性


程序举例(一个人有两个宠物)

  • Cat类
    package com.jing.pojo;
    
    public class Cat {
    
        public void shout(){
            System.out.println("喵");
        }
    }
    
  • Dog类
    package com.jing.pojo;
    
    public class Dog {
    
        public void shout(){
            System.out.println("汪");
        }
    }
    
  • Person类
    public class Person {
    
        private Cat cat;
        private Dog dog;
        private String name;
    
        public Cat getCat() {
            return cat;
        }
    
        public void setCat(Cat cat) {
            this.cat = cat;
        }
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "cat=" + cat +
                    ", dog=" + dog +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    

装配

所谓“装配”,是为bean注入依赖引用型属性)。Spring中有三种装配(依赖注入)方式

  • 手动装配:XML配置文件中显式配置bean的属性(依赖注入的三种方式)
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="cat" class="com.jing.pojo.Cat"/>
        <bean id="dog" class="com.jing.pojo.Dog"/>
        <bean id="person" class="com.jing.pojo.Person">
            <property name="name" value="YuJing"/>
            <!--依赖注入-->
            <property name="cat" ref="cat"/>
            <property name="dog" ref="dog"/>
        </bean>
        
    </beans>

  • 自动装配:XML配置文件注解是都可以实现自动装配。
    • XML配置文件实现自动装配:
      • autowire="byType":先根据属性的数据类型匹配,再根据属性名称匹配。
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd">
            <bean id="dog" class="com.jing.pojo.Dog"></bean>
            <bean id="cat" class="com.jing.pojo.Cat"></bean>
            <!--byType:会自动在容器上下文查找,和自己对象属性类型相同的bean!-->
            <bean id="person" class="com.jing.pojo.Person" autowire="byType"></bean>
        </beans>
      • autowire="byName":先根据属性名称匹配,再根据属性的数据类型匹配。
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd">
            <bean id="dog" class="com.jing.pojo.Dog"></bean>
            <bean id="cat" class="com.jing.pojo.Cat"></bean>
            <!--byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid!-->
            <bean id="person" class="com.jing.pojo.Person" autowire="byName"></bean>
        </beans>
    • 注解实现自动装配:在类的成员属性的定义上方加上注解,自动装配是通过反射直接获取属性(field)实现的,所以不需要setter方法
      • @Autowired:Spring提供的注解,先根据类型,再根据名称。
        • 先根据bean所对应的类中的属性的数据类型进行bean(被依赖的bean)匹配:
          • 如果IOC容器中没有类型匹配的bean,则匹配失败;
          • 如果有,而且相同类型的bean只有一个,则直接匹配成功;
          • 如果有,但是相同类型的bean不止一个,则需要进一步根据属性名称进行匹配:
            • 如果可以根据名称唯一确定一个对应的bean(类型匹配,名称匹配),则匹配成功;(属性名称为cat,IOC容器中的bean:cat 或者 cat111 或者 cat和cat111都有,上述三种情况都可以匹配成功。)
            • 否则失败。(属性名称为cat,IOC容器中的bean:cat111和cat222,这种情况将失败)
      • @ResourceJDK提供的注解,先根据名称,再根据类型。最终只要能够确定一个唯一的bean,则可以成功装配;如果产生歧义,将无法装配

标签:装配,Resource,Autowired,cat,bean,匹配,public,属性
来源: https://blog.csdn.net/weixin_44250483/article/details/121256837

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有