Spring的自动装配Bean的三种方式

发布时间 - 2026-01-10 23:18:18    点击率:

spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、<constructor-arg>)。IOC容器会自动建立javabean之间的关联关系。

如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配:

<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="customerDAO" class="com.hebeu.customer.dao.JdbcCustomerDAO"> 
    <property name="dataSource" ref="dataSource" /> 
  </bean> 
 
</beans> 

通过<property name="dataSource" ref="dataSource" />向customerDAO的bean中注入了dataSource

在Spring框架,可以用 auto-wiring 功能会自动装配Bean。要启用它,只需要在 <bean>定义“autowire”属性。

<bean id="customer" class="com.yiibai.common.Customer" autowire="byName" />

在Spring中,支持 5 自动装配模式。

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
  • constructor – 在构造函数参数的byType方式。
  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。【在Spring3.0以后的版本被废弃,已经不再合法了】

第一种自动装配【根据属性名称自动装配】

package com.hebeu.model; 
 
public class Customer { 
 
  private Address address; 
   
  public Customer() { 
     
  } 
   
  public Customer(int id, Address address) { 
    super(); 
    this.address = address; 
  } 
 
  public Address getAddress() { 
    return address; 
  } 
 
  public void setAddress(Address address) { 
    this.address = address; 
  } 
   
} 

package com.hebeu.model; 
 
public class Address { 
 
  private String fulladdress; 
   
  public Address(){ 
     
  } 
   
  public Address(String addr){ 
    this.fulladdress = addr; 
  } 
 
  public String getFulladdress() { 
    return fulladdress; 
  } 
 
  public void setFulladdress(String fulladdress) { 
    this.fulladdress = fulladdress; 
  } 
   
} 

<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="customer" class="com.hebeu.model.Customer" autowire="byName"></bean>
   
  <bean id="address" class="com.hebeu.model.Address"> 
    <property name="fulladdress" value="YiLong Road, CA 188"></property> 
  </bean> 
   
</beans>  

这样就将address注入到Customer中。这就是自动注入ByName.在Customer bean中公开了一个属性address,Spring容器会找到address bean,并且装配。这里必须要注意,Customer中要被注入的bean的set方法要求必须是public的,否则会报空指针异常。还有配置的bean的id必须和Customer中声明的变量名相同。

第二种自动装配【根据数据类型自动装配】

声明的俩个bean同样为Customer以及Address,将applicationContext.xml转换为这样的就是实现根据数据类型进行自动装配。

<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="customer" class="com.hebeu.model.Customer" <strong><span style="color:#FF0000;">autowire="byType"</span></strong>></bean> 
   
  <bean id="bean1" class="com.hebeu.model.Address"> 
    <property name="fulladdress" value="YiLong Road, CA 188"></property> 
  </bean> 
</beans>  

类型自动装配的意思是如果一个bean的数据类型与其他的bean属性的数据类型相同,将会自动兼容装配它。当然要求只能配置一个某一个类型的bean.如果配置成这样,那么是会出错的。

<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="customer" class="com.hebeu.model.Customer" autowire="byType"></bean> 
   
  <bean id="bean1" class="com.hebeu.model.Address"> 
    <property name="fulladdress" value="YiLong Road, CA 188"></property> 
  </bean> 
  <bean id="bean2" class="com.hebeu.model.Address"> 
    <property name="fulladdress" value="YiLong Road, CA 188"></property> 
  </bean> 
</beans>  

第三种自动装配【根据构造方法自动装配】

案例同上,将applicationContext.xml转换为如下,就实现了按照构造方法自动装配:

<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="customer" class="com.hebeu.model.Customer"> 
    <!-- 构造方法的参数 --> 
    <constructor-arg> 
      <ref bean="bean1"/> 
    </constructor-arg> 
  </bean> 
   
  <bean id="bean1" class="com.hebeu.model.Address"> 
    <property name="fulladdress" value="YiLong Road, CA 188"></property> 
  </bean> 
   
</beans> 

 它实际上是构造函数的参数类型自动装配。这意味着如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么就自动装配。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring装配bean  # spring  # bean自动装配  # spring自动装配  # 详解Spring Bean的集合注入和自动装配  # Spring使用注解实现Bean的自动装配  # Spring中Bean的作用域和自动装配方式  # Spring注解实现Bean自动装配示例详解  # Spring自动装配Bean实现过程详解  # 在Spring中自动装配Bean的属性  # spring入门教程之bean的继承与自动装配详解  # 浅谈Spring装配Bean之组件扫描和自动装配  # Spring Bean自动装配入门到精通  # 将会  # 会报  # 转换为  # 配置文件  # 这就是  # 可以用  # 只需  # 要在  # 要注意  # 如果没有  # 就将  # 第二种  # 第一种  # 中要  # 大家多多  # 第三种  # 实现了  # 情况下  # 关联关系  # 变量名 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  南京网站制作费用,南京远驱官方网站?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  韩国服务器如何优化跨境访问实现高效连接?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何快速搭建虚拟主机网站?新手必看指南  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何在万网自助建站平台快速创建网站?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何在云主机上快速搭建网站?  如何在阿里云域名上完成建站全流程?  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  html5的keygen标签为什么废弃_替代方案说明【解答】  JavaScript如何实现音频处理_Web Audio API如何工作?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Android Socket接口实现即时通讯实例代码  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何用搬瓦工VPS快速搭建个人网站?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何快速完成中国万网建站详细流程?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  php json中文编码为null的解决办法  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Bootstrap整体框架之CSS12栅格系统  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  长沙企业网站制作哪家好,长沙水业集团官方网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何生成URL和重定向?(路由助手函数)  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何用花生壳三步快速搭建专属网站?  如何快速生成专业多端适配建站电话?  焦点电影公司作品,电影焦点结局是什么?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  制作企业网站建设方案,怎样建设一个公司网站?  音响网站制作视频教程,隆霸音响官方网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  php 三元运算符实例详细介绍  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  公司网站制作价格怎么算,公司办个官网需要多少钱?