Spring的自动装配 byName和byType的区别

2023-11-17

Spring的自动装配

好处:大幅度减少Spring配置 

坏处:依赖不能明确管理,可能会有多个bean同时符合注入规则,没有清晰的依赖关系。 

在装配的时候会有两种方式,byName和byType两种。

byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。 

byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置 
看代码: 

UserDAO的实现类 有一个属性daoId

public class UserDAOImpl implements UserDAO { 
    private int daoId; 
    public int getDaoId() { 
      return daoId; 
    } 
    public void setDaoId(int daoId) { 
      this.daoId = daoId; 
    } 
    public void save(User user) { 
      System.out.println("user saved!"); 
    } 
    @Override 
    public String toString() { 
      return "daoId=" + daoId; 
    } 
} 

UserService 依赖了UserDAO

public class UserService { 
    private UserDAO userDAO;  
    public void add(User user) { 
        userDAO.save(user); 
    } 
    public UserDAO getUserDAO() { 
        return userDAO; 
    } 
    public void setUserDAO(UserDAO userDAO) { 
        this.userDAO = userDAO; 
    } 
} 

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-2.5.xsd"> 

    <!--第一个UserDAO bean-->
  <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> 
   <property name="daoId" value="1"></property> 
  </bean> 

   <!--第二个UserDAO bean-->
  <bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl"> 
   <property name="daoId" value="2"></property> 
  </bean> 

   <!-- 这里的byName是按照属性名进行匹配 这里我们并没有注入UserDAO
   但是你的UserService属性名称是UserDAO 所以就相当于 你注入了UserDAO
   相当于在bean中添加<property name="userDAO" ref="userDAO"/> 一样
   --> 

  <bean id="userService" class="com.bjsxt.service.UserService"  autowire="byName">
  </bean> 

   <!--需要注意的是在UserService类中,一定要有一个名为setUserDao的构造方法,其中setter
    方法名要与bean的id对应set+name,name首字母大写,否则无法成功注入-->

</beans> 

测试: 

ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
UserService service = (UserService)ctx.getBean("userService"); 
System.out.println(service.getUserDAO()); 
//打印出来是1 说明默认注入的是UserDAO 

改成byType的话是按照类型自动装配:

<?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-2.5.xsd"> 

    <!--第一个UserDAO bean-->
  <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> 
   <property name="daoId" value="1"></property> 
  </bean> 

   <!--第二个UserDAO bean,这里需要删除掉一个,类型相同的多个bean通过byType
    注入时会报错
  <bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl"> 
   <property name="daoId" value="2"></property> 
  </bean> 
    -->

   <!-- autowire修改为"byType",重点是保证--> 

  <bean id="userService" class="com.bjsxt.service.UserService"  autowire="byType">
  </bean> 

   <!--需要注意的是在UserService类中,一定要有一个名为setUserDao的构造方法,被装配类中的
    setter方法的参数类型要与bean的class的类型一样,否则无法成功注入-->

</beans> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring的自动装配 byName和byType的区别 的相关文章

随机推荐

  • JS敏感信息泄露:不容忽视的WEB漏洞

    0x00 前言 这段时间jsonp漏洞再一次证明了一个微小的漏洞 经过攻击者的巧妙而持久的利用 也会对企业和用户造成巨大的危害 而本文将要介绍的JS泄露敏感信息问题也是如此 攻击者不仅可以轻松收集用户手机号 姓名等隐私信息 更可以借此攻入企
  • StreamUtils

    StreamUtils org springframework util StreamUtils 输入 从字节数组到输出流 void copy byte in OutputStream out 从输入流到输出流 int copy Input
  • 刷脸支付不带手机钱包一样可以买单

    今年 移动支付加快脚步 迅速腾飞 其中最受国内外各大企业商户重视的 应该属去年开始投入使用的刷脸支付设备了与扫描二维码等很多移动收款方法 刷脸 支付的应用更为方便 支付的效率更高 安全性更强 无疑速决了很多当前的短处 手机扫码签约免密支付
  • Eclipse打开时出现failed to create the java virtual machine...

    一 问题分析 关于Eclipse出现failed to create the java virtual machine 等情况 1 重装系统之后会发现eclipse很意外的打不开 2 有时候Eclipse使用的时间过长 3 以上情况都会出现
  • vue-router设置默认路由

    git仓库 https github com xiaoli0510 vue router vue使用vue router步骤 1 安装并创建实例 npm install vue router 2 新建router 文件夹和router js
  • libvirt介绍

    libvirt是为了更方便地管理各种Hypervisor而设计的一套虚拟化库 libvirt作为中间适配层 让底层Hypervisor对上层用户空间的管理工具 virsh virt manager 做到完全透明 因为libvirt屏蔽了底层
  • 云原生Java架构师的第一课阿里云部署docker2- (docker实战-安装mysql)

    docker安装成功 后面就只需要去找对应的网站进行镜像下载安装就可以安装任意版本的数据库 而不需要考虑Linux服务器版本和架构 1 拉取 MySQL 镜像 去docker hub 找到mysql镜像 上面有所有的mysql版本和拉取镜像
  • 【网安神器篇】——hydra爆破工具

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 舞台再大 你不上台 永远是观众 没人会关心你努不努力 摔的痛不痛 他们只会看你最后站在什么位置 然后羡慕或鄙夷座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日
  • 用photoshop拼接一个七巧板图案

    转自 https jingyan baidu com article 215817f7a1f6fb1eda1423f8 html 图片处理软件图片市场是一个常见的工具软件 我们在使用时可以自己发掘一些有意思的功能 笔者从旋转拼接角度 以一个
  • 8-3编码器,3-8译码器的verilog实现

    在数字系统中 由于采用二进制运算处理数据 因此通常将信息变成若干位二进制代码 在逻辑电路中 信号都是以高 低电平的形式输出 编码器 实现编码的数字电路 把输入的每个高低电平信号编成一组对应的二进制代码 设计一个输入为8个高电平有效信号 输出
  • 回到十七世纪,让我来编算一本常用对数表(对数结果是小数,要有分数的思想,指数的幂是分数,这样可以实现小数分数转化位整数的幂的求法)

    原文地址 回到十七世纪 让我来编算一本常用对数表作者 小牛 自十八 九岁学习了对数后 就觉得造对数表真不简单 据说十七世纪那时 说如果谁发现了对数表上有一个数字错 就奖一两黄金 据百科百度 纳皮尔 1550 1617年 苏格兰数学家 对数的
  • GBK/GBK2312字库寻址及使用原理

    一 字符编码 1 1 ASCII编码 我们知道 我们所见到的所有字符编码 对于计算机来说都是0 1 更具不同位上的0 1 一个字节 8位 共有256中排列方式 因此一个字节就可以表示256个不同的字符 在这个前提下 ASCII编码就由美国制
  • 因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用

    因材施教的教育宗旨下 大模型浪潮中 网易有道凭借其对教育场景的深入理解和对商业化的理性思考 为行业树立了垂直大模型的典范 7月26日 教育科技公司网易有道举办了 powered by 子曰 教育大模型应用成果发布会 会上重磅推出了国内首个教
  • 游戏与创新

    一 严肃游戏的概念 严肃游戏的出现 最早可以追溯到公元前1400年 当时在古埃及 有一款名为播棋的棋类游戏 这种游戏以植物种子或石子作为道具 在地面或棋盘上 目的是把对方的棋子吃掉 同时 播棋也在日常交易中 被用作计算数量的商业辅助工具 严
  • 5G 速率介绍

    本文就对如何计算最大速率不做介绍 主要介绍的是NSA和SA速率的差别 以及上下行速率的差异 由于5G单用户下行可以到4流 上行可以到2流 而且上下行都支持256QAM 2 6G频率 5ms单周期 配置下 NSA和SA终端下行峰值速率约1 6
  • 用FFmpeg制作WebP动图

    去年写过一篇文章 是教大家用FFmpeg制作GIF动画的 今天在讨论到项目中碰到的一个 apng动画素材引起的程序崩溃时 有位同学建议 我们为啥不用WebP来代替 apng 是啊 why not 网上搜到一篇文章 自己试了一下 发现强大的F
  • SQL Server Management Studio (SSMS) 指定端口Port连接, 用逗号, 例如: localhost,1433

    Microsoft SQL Server Management Studio SSMS 指定端口连接 用 逗号 例如 localhost 1433 localhost 等效 localhost 逗号 1433
  • QT 解决“ qt creator 修改UI后,运行无改变”问题

    只需要将 项目 中的 Shadow build 勾选去掉 重新构建项目 运行即可看到修改后的效果
  • 三、-切换frame&css选择器

    等待元素出现 隐式等待 用WebDriver 对象的implicitly wait方法 这个方法有一个参数 指明等待最长时间 driver implicitly wait 10 显式等待 Selenium里面还有一种称之为显式等待的 可以为
  • Spring的自动装配 byName和byType的区别

    Spring的自动装配 好处 大幅度减少Spring配置 坏处 依赖不能明确管理 可能会有多个bean同时符合注入规则 没有清晰的依赖关系 在装配的时候会有两种方式 byName和byType两种 byName 根据属性名自动装配 此选项将