Spring Bean自动装配的简介说明
Spring Bean装配为依赖关系注入
Spring Bean装配方式称之为"Spring Bean依赖注入方式
Spring Bean容器拥有多种装配Bean方式
自动装配:指Spring IoC容器在不使用<constructor-arg>和<property>标签的情况下
自动装配Bean之间的关系(将一个Spring Bean注入到其它的Spring Bean的Property中)
例:
Bean 依赖通过 ref 元素定义,Beans.xml 配置文件
XML 文件中 Bean 的 id 必须与类中的属性名称相同
配置文件内容修改如下
在man的有参构造函数内
在Person的构造函数内
名称:java265.com
年龄:88
当我们修改为Bean名称自动装配时,可能会出现不注入依赖项
将 Bean 的名称更改为 man1,配置文件如下
在man的有参构造函数内
在Person的构造函数内
名称:java265.com
年龄:88
当存在多个相同类型Bean,则注入失败,并且引发异常 添加 id 为 man2 的 Bean,配置文件代码如下
在man的有参构造函数内
在Person的构造函数内
名称:java265.com
年龄:888
Spring Bean装配方式称之为"Spring Bean依赖注入方式
Spring Bean容器拥有多种装配Bean方式
- 如:使用XML 装配Bean
- 使用Annotation Bean 装配
- 使用自动装配等方式
自动装配:指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 模式 |
- 创建 SpringDemo 项目
- 在 src 目录下创建 com.java265 包
- 添加相应的 jar 包,可以查看 我的第一个Spring程序
- 在 com.java265 包下创建 Person、Man 和 MainApp 类
- 在 src 目录下创建 Spring 配置文件 Beans.xml
- 运行 SpringDemo 项目
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
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。