Spring Bean自动装配
Spring 基于 XML 的装配通常采用两种实现方式,即我们在《Spring依赖注入》一节介绍的 setter 注入和构造注入。本节介绍如何配置自动装配。
自动装配就是指 Spring 容器在不使用 constructor-arg 和 property 标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中。
使用自动装配需要配置 bean 元素的 autowire 属性。autowire 属性有五个值,具体说明如下表所示。
根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。
根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。
添加相应的 jar 包,可以参考《第一个Spring程序》一节。 在 net.biancheng 包下创建 Person、Man 和 MainApp 类。 在 src 目录下创建 Spring 配置文件 Beans.xml。 运行 SpringDemo 项目。
Person 类代码如下。
package net.biancheng; public class Person { private Man man; public Person(Man man) { System.out.println( 在Person的构造函数内 this.man = man; public void man() { man.show(); }
Man 类代码如下。
package net.biancheng; 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 net.biancheng; 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(); }1)不使用自动装配(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 > 2)按名称自动装配(autowire= byName )autowire= byName 表示按属性名称自动装配,XML 文件中 Bean 的 id 必须与类中的属性名称相同。配置文件内容修改如下。
bean id= man >运行结果如下。
在man的有参构造函数内
在Person的构造函数内
名称:bianchengbang
年龄:12如果更改 Bean 的名称,很可能不会注入依赖项。
将 Bean 的名称更改为 man1,配置文件如下:
bean id= man1 >注入失败,异常信息为:
在man的有参构造函数内
3)按类型自动装配(autowire= byType )
Exception in thread main java.lang.NullPointerException
at net.biancheng.Person.man(Person.java:16)
at net.biancheng.MainApp.main(MainApp.java:10)XML 文件中 Bean 的 id 与类中的属性名称可以不同,但必须只有一个类型的 Bean。配置文件内容修改如下。
bean id= man1 >运行结果如下。
在man的有参构造函数内
在Person的构造函数内
名称:bianchengbang
年龄:12如果您有相同类型的多个 Bean,则注入失败,并且引发异常。
添加 id 为 man2 的 Bean,配置文件代码如下。
bean id= man1 >异常信息为:
在man的有参构造函数内
4)构造函数自动装配(autowire= constructor )
在man的有参构造函数内
一月 26, 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 net.biancheng.Man available: expected single matching bean but found 2: man1,man2
修改 Person 类的代码。
package net.biancheng; 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 id= man >运行结果如下。
在man的有参构造函数内
自动装配的优缺点
在Person的构造函数内
名称:bianchengbang
年龄:12
相关文章
- 玩转 Spring Boot 原理篇(自动装配源码剖析)(十二)
- 简单介绍一下spring bean的生命周期_Spring bean的生命周期
- Spring Boot自动装配原理
- Spring读源码系列番外篇09--BeanWrapper的应用
- Spring batch教程 之 spring batch简介
- Quartz SchedulerFactoryBean异常–Spring自动装配惹的祸
- 《面试季》高频面试题-Spring篇(二)
- 聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及自动刷新
- Spring | Bean自动装配详解
- 透过Spring自动配置原理看Spring的扩展点
- Spring boot集成RocketMQ
- ajax长轮询 spring mvc,springmvc ajax 长轮询
- Spring validator常用注解
- 扼住高并发、高性能的咽喉---Spring Boot并发进阶
- Spring 框架介绍和使用
- Spring Boot + LayUi登陆遇到问题记录
- Spring-JDBCTemplate
- Spring Cloud Bus监听服务配置的变化并自动通知其他服务(二)
- Spring Cloud Bus集成Spring Cloud Config Server实现全局配置的自动刷新(一)
- Spring Cloud Task 高级特性Task Dependency示例
- Spring JdbcTemplate类
- spring boot 自动部署方案详解架构师
- spring的自动装配基础详解编程语言
- Spring的三种注入方式(Setter、构造函数和自动注入)详解编程语言
- Spring Boot(五):spring data jpa的使用详解编程语言
- spring web.xml配置服务启动后执行文件详解编程语言
- Spring框架下整合Redis的实现(spring整合redis)
- Spring框架致力于搭建基于MSSQL的稳健开发体系(spring mssql)