• Spring Bean自动装配的简介


    转自:

    Spring Bean自动装配的简介说明

    Spring Bean装配为依赖关系注入
    Spring Bean装配方式称之为"Spring Bean依赖注入方式
    Spring Bean容器拥有多种装配Bean方式

    1. 如:使用XML 装配Bean
    2. 使用Annotation Bean 装配
    3. 使用自动装配等方式

    那么下文将主要讲述 “自动装配
    自动装配:指Spring IoC容器在不使用标签的情况下
    自动装配Bean之间的关系(将一个Spring Bean注入到其它的Spring Bean的Property中)

    实现思路:
        在Spring Bean中,我们需使用Autowire属性即可实现自动装配操作,Autowire拥有以下5个属性
    
    属性名 详解
    no 默认值表示不使用自动装配,Bean 依赖必须通过 ref 元素定义
    byName使用Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中
    byType使用Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配
    constructor类似于 byType,根据构造方法参数的数据类型,进行 byType 模式的自动装配
    autodetect(3.0版本不支持)如果 Bean 中有默认的构造方法,则用 constructor 模式,否则用 byType 模式

    例:

    1. 创建 SpringDemo 项目
    2. 在 src 目录下创建 com.java265 包
    3. 添加相应的 jar 包,可以查看 我的第一个Spring程序
    4. 在 com.java265 包下创建 Person、Man 和 MainApp 类
    5. 在 src 目录下创建 Spring 配置文件 Beans.xml
    6. 运行 SpringDemo 项目

    Person 类

    package com.java265;
    public class Person {
        private Man man;
        public Person(Man man) {
            System.out.println("在Person的构造函数内");
            this.man = man;
        }
        public void man() {
            man.show();
        }
    }
    

    Man 类

    package com.java265;
    public class Man {
        private String name;
        private int age;
        public Man() {
            System.out.println("在man的构造函数内");
        }
        public Man(String name, int age) {
            System.out.println("在man的有参构造函数内");
            this.name = name;
            this.age = age;
        }
        public void show() {
            System.out.println("名称:" + name + "\n年龄:" + age);
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    MainApp 类

    package com.java265;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class MainApp {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
            Person person = (Person) context.getBean("person");
            person.man();
        }
    }
    

    不使用自动装配(autowire="no")

    autowire="no":不使用自动装配,采用手动注入
    Bean 依赖通过 ref 元素定义,Beans.xml 配置文件

    
    
        
            
            
        
        
            
        
    
    
    

    使用名称自动装配(autowire="byName")

    autowire="byName":使用属性名称自动装配
    XML 文件中 Bean 的 id 必须与类中的属性名称相同
    配置文件内容修改如下

    
        
        
    
    
    
    
    

    运行结果-----
    在man的有参构造函数内
    在Person的构造函数内
    名称:java265.com
    年龄:88
    当我们修改为Bean名称自动装配时,可能会出现不注入依赖项
    将 Bean 的名称更改为 man1,配置文件如下

    
        
        
    
    
    
    
    注入失败,弹出以下异常信息--- 
    在man的有参构造函数内  
    Exception in thread "main" java.lang.NullPointerException  
    at com.java265.Person.man(Person.java:16)  
    at com.java265.MainApp.main(MainApp.java:10) 
    

    使用类型自动装配(autowire="byType")


    XML 文件中 Bean 的 id 与类中的属性名称可以不同
    但必须只有一个类型的 Bean
    配置文件内容修改如下所示:

    
        
        
    
    
    
    

    运行结果---
    在man的有参构造函数内
    在Person的构造函数内
    名称:java265.com
    年龄:88
    当存在多个相同类型Bean,则注入失败,并且引发异常 添加 id 为 man2 的 Bean,配置文件代码如下

    
      
      
    
    
      
      
    
    
    
    
    异常信息为:
    在man的有参构造函数内
    在man的有参构造函数内
    七月 16, 2021 1:34:14 下午 org.springframework.context.support.AbstractApplicationContext refresh
    警告: Exception encountered during context initialization - cancelling refresh attempt: 
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'person' defined in class path resource [Beans.xml]: 
    Unsatisfied dependency expressed through bean property 'man'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
     No qualifying bean of type 'com.java265.Man' available: expected single matching bean but found 2: man1,man2
    ...
    
    

    构造函数自动装配(autowire="constructor")

    变更 Person 类

    package com.java265;
    public class Person {
        private Man man;
        public Person(Man man) {
            System.out.println("在Person的构造方法内");
            this.man = man;
        }
        public Man getMan() {
            return man;
        }
        public void man() {
            man.show();
        }
    }
    
    

    类中构造函数的参数必须在配置文件中有相同的类型,配置文件内容修改如下

    
        
        
    
    
    
    

    运行结果----
    在man的有参构造函数内
    在Person的构造函数内
    名称:java265.com
    年龄:888

  • 相关阅读:
    开源语言大模型演进史:向LLaMA 2看齐
    ubuntu 20.04 docker 安装 mysql
    SpringMVC的请求(上)
    代码审查插件:Devart Review Assistant Crack
    JDK1.8下载、安装和环境配置使用
    Nautilus Chain全球行分享会,上海站圆满举办
    Numpy入门[4]——数组类型
    Vue2.0 —— Vue.nextTick(this.$nextTick)源码探秘
    99%的时间里使用的14个git命令
    【计算机视觉40例】案例21:图像分类
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127700564