Spring Bean自动装配的简介

转自:

Spring Bean自动装配的简介说明

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

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

那么下文将主要讲述 “自动装配”
自动装配:指Spring IoC容器在不使用<constructor-arg>和<property>标签的情况下
自动装配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 配置文件

<?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-3.0.xsd">
    <bean id="man" class="com.java265.Man">
        <constructor-arg value="java265.com" />
        <constructor-arg value="88" type="int" />
    </bean>
    <bean id="person" class="com.java265.Person" autowire="no">
        <constructor-arg ref="man" type="java.lang.String"/>
    </bean>
</beans>

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

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

<bean class="com.java265.Man" id="man">
    <constructor-arg value="java265.com">
    <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean autowire="byName" class="com.java265.Person" id="person">

</bean>

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

<bean class="com.java265.Man" id="man1">
    <constructor-arg value="java265.com">
    <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean autowire="byName" class="com.java265.Person" id="person">

</bean>
注入失败,弹出以下异常信息--- 
在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
配置文件内容修改如下所示:

<bean class="com.java265.Man" id="man1">
    <constructor-arg value="java265.com">
    <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean autowire="byType" class="com.java265.Person" id="person">

</bean>

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

<bean class="com.java265.Man" id="man1">
  <constructor-arg value="java265.com">
  <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean class="com.java265.Man" id="man2">
  <constructor-arg value="java265.com">
  <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean autowire="byType" class="com.java265.Person" id="person">

</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();
    }
}

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

<bean class="com.java265.Man" id="man">
    <constructor-arg value="java265.com">
    <constructor-arg type="int" value="88">
</constructor-arg></constructor-arg></bean>
<bean autowire="constructor" class="com.java265.Person" id="person">

</bean>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值