[html] view plaincopy
  1. Spring的注入方式详解
  2. Spring有三个注入方式,type1,type2,type3
  3. type1  接口依赖
  4. type2  setter/getter
  5. type3  构造方法
  6. type2,type3较用常用
  7. 首先来看一下type2
  8. type2 setter/getter(引用注入)
  9. 例如,存在一个User类和Home类
  10. user类里一个userName;一个Home对象的属性.
  11. public class User {
  12. private String userName;
  13. private Home myHome;
  14. public Home getMyHome() {
  15. return myHome;
  16. }
  17. public void setMyHome(Home myHome) {
  18. this.myHome = myHome;
  19. }
  20. public String getUserName() {
  21. return userName;
  22. }
  23. public void setUserName(String userName) {
  24. this.userName = userName;
  25. }
  26. }
  27. public class Home {
  28. private String homeAddr;
  29. public String getHomeAddr() {
  30. return homeAddr;
  31. }
  32. public void setHomeAddr(String homeAddr) {
  33. this.homeAddr = homeAddr;
  34. }
  35. }
  36. public class TestMain {
  37. public static void main(String[] args) {
  38. ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");
  39. User user1=(User)context.getBean("user");
  40. System.out.println(“姓名为: ”+user1.getUserName());
  41. System.out.println(“家庭住址是: ”+user1.getMyHome().getHomeAddr());
  42. }
  43. }
  44. 将两个bean的注入:(applicationContext.xml配置如下)
  45. <bean id="home" class="test.lyx.Home" abstract="false"
  46. singleton="true" lazy-init="default" autowire="default"
  47. dependency-check="default">
  48. <property name="homeAddr">
  49. <value>大连</value>
  50. </property>
  51. </bean>
  52. <bean id="user" class="test.lyx.User" abstract="false"
  53. singleton="true" lazy-init="default" autowire="default"
  54. dependency-check="default">
  55. <property name="userName">
  56. <value>liuyuanxi</value>
  57. </property>
  58. <property name="myHome">
  59. <ref bean="home"/>
  60. </property>
  61. </bean>
  62. 这里的user bean,引用了home bean,
  63. 运行时会打出 
  64. 姓名为:liuyuanxi
  65. 家庭住址是:大连
  66. 这种方式就是setter/getter方式注入,习惯用JavaBean的人应该很容易理解这种方法,也就是能过<property name="userName">来指定属性. <value>liuyuanxi</value>来指定属性所对应的值.多少个属性就有多少个<property>
  67. 这里一个人,和家是两个类,也提到了两个bean之间的引用.也就是user bean给名字赋了值,home bean给地址赋了值.如果在user bean中想引入 home bean中的地址.就用<ref/>不再用<values>
  68. type3 构造方法注入
  69. 这里我们在User里加入一个构造器
  70. public User(Home myHome){
  71. this.myHome=myHome;
  72. }
  73. 然后 把配置文件改一下:autowire=constructor;
  74. <bean id="home" class="test.lyx.Home" abstract="false"
  75. singleton="true" lazy-init="default" autowire="default"
  76. dependency-check="default">
  77. <property name="homeAddr">
  78. <value>大连</value>
  79. </property>
  80. </bean>
  81. <bean id="user" class="test.lyx.User" abstract="false"
  82. singleton="true" lazy-init="default" autowire=" constructor "
  83. dependency-check="default">
  84. <property name="userName">
  85. <value>liuyuanxi</value>
  86. </property>
  87. <property name="myHome">
  88. <ref bean="home"/>
  89. </property>
  90. </bean>
  91. 运行时会打出 
  92. 姓名为:liuyuanxi
  93. 家庭住址是:大连
  94. 这种方式就是构造器注入
  95. 我们再来看看spring的绑定
  96. 也就是通过bean属性autowire来设置
  97. 1.       通过bean属性autowire="byType"的设置可以使用bean在运行时候根据去寻找同类型的已定义属性,如果找不到则处于未绑定状态.(已定义好指在applicationContext.xml中初始化)这里我们把配置文件的 user bean的autowire改成autowire="byType",注意一定要把User的构造器去掉,要不然先找构造器,会出错.这里的home bean是属于,test.lyx.Home类型的,而user bean里有两个属性一个属性已经初始化,而另一个属性Home,就会自动找到.
  98. applicationContext.xml配置如下:
  99. <bean id="home" class="test.lyx.Home" abstract="false"
  100. singleton="true" lazy-init="default" autowire="default"
  101. dependency-check="default">
  102. <property name="homeAddr">
  103. <value>大连</value>
  104. </property>
  105. </bean>
  106. <bean id="user" class="test.lyx.User" abstract="false"
  107. singleton="true" lazy-init="default" autowire=" byType "
  108. dependency-check="default">
  109. <property name="userName">
  110. <value>liuyuanxi</value>
  111. </property>
  112. <property name="myHome">
  113. <ref bean="home"/>
  114. </property>
  115. </bean>
  116. 运行时会打出 
  117. 姓名为:liuyuanxi
  118. 家庭住址是:大连
  119. 这种方式就是构造器注入
  120. 但这样的寻找方式有一个弱点,
  121. 假如再注入一个Home bean,叫home1,运行时就会找到两个bean,出错.
  122. <bean id="home1" class="test.lyx.Home" abstract="false"
  123. singleton="true" lazy-init="default" autowire="default"
  124. dependency-check="default">
  125. <property name="homeAddr">
  126. <value>beijing</value>
  127. </property>
  128. </bean>
  129. 如果我们想解决这种问题也很简单,我们可以把autowire改为,autowire="byName"方式来寻找.
  130. 但是这里一定要注意:Home bean的id名,一定要和属性名字一样.这里应该改成,id="myHome"
  131. <bean id="home1" class="test.lyx.Home" abstract="false"
  132. singleton="true" lazy-init="default" autowire="default"
  133. dependency-check="default">
  134. <property name="homeAddr">
  135. <value>dalian</value>
  136. </property>
  137. </bean>
  138. <bean id="myHome" class="test.lyx.Home" abstract="false"
  139. singleton="true" lazy-init="default" autowire="default"
  140. dependency-check="default">
  141. <property name="homeAddr">
  142. <value>北京</value>
  143. </property>
  144. </bean>
  145. 这样的话
  146. 运行时会打出 
  147. 姓名为:liuyuanxi
  148. 家庭住址是:北京
  149. 而不在是大连了,这种寻找方式就是byName,也就是按属性的名字进行查询.注意:id一定要属性的名字一样.
  150. 2.我们来比较一个byname和 bytype这两种方式.
  151. byname要比bytype精确些,因为id,是不能重名的.
  152. 而且假如存在一这样一种情况,两个user bean,分别为user1,user2,那么user1,user2都可以,打出北京.重用性很好.
  153. 到这可能有人会想到.user1,和user2调用的是同一个Home吗.你可以把他们的hashcode();打出来,你会发现地址是一样的,也就是说,是同一个bean.这里是因为singleton="true"的原因,如果你把singleton改成了"false"那就不是一个对象了.
  154. 3.如果把autowire=” constructor”也就是构造器注入一定要注意了,他是以byType进行查找,也就是说,Home bean,是不能出现两次,否则就会出错了.
  155. 4.如果autowire设置成为autodetect,他会一直找,直到找到一个合适的为止.constructor,bytype,byname的顺序去找.这种方式是不推荐使用的.因为你很难判断出执行的是那个.

Spring的注入方式详解相关推荐

  1. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  2. @Resource,@Autowired,@Inject3种注入方式详解

    转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...

  3. spring依赖注入原理详解(转载)

    spring依赖注入原理详解----转载 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所 ...

  4. spring的依赖注入方式详解

    第一种:使用setter注入 直接使用bean元素的子元素property进行相关的设置 ①简单类型,直接使用value进行赋值. <bean id="somebean" c ...

  5. spring依赖注入原理详解

    所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所以我们只需从容器直接获取Bean对象就行, ...

  6. Spring中bean的执行初始化和销毁方法的4种方式详解

    一.引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等. ...

  7. Spring EL表达式使用详解

    Spring EL表达式使用详解 什么是Spring EL表达式 注入字面值 注入操作系统(OS)的属性 注入properties配置文件中数据 Bean属性调用 Bean方法调用 T运算符 构造器 ...

  8. java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解

    本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...

  9. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

最新文章

  1. 6、数据库设计为什么要使用三大范式
  2. 防火墙未开启导致通过redis篡改.ssh/authorized_keys
  3. [C/C++] constexpr函数
  4. SAP Spartacus B2B user列表对应的Angular Component
  5. java先进先出 循环队列,JavaScript队列、优先队列与循环队列
  6. 贪婪洞窟2服务器维护,《贪婪洞窟2》11月30日更新维护多久 贪婪洞窟2更新维护公告...
  7. 统考计算机和英语百度网盘,《计算机专业英语》在线考试系统
  8. 日志log4j配置详情,日志log具体到你想不到
  9. PHP什么架构,PHP是什么-PHP的架构及道理概述_后端开发
  10. 清华姚班毕业生开发新特效编程语言,99行代码实现《冰雪奇缘》,网友:大神碉堡!创世的快乐
  11. Python 数据处理 | 详解缩尾处理(winsorize)和代码实践
  12. 想学python网课哪个好-推荐书单(网课)-人生/编程/Python/机器学习-191本
  13. 数据驱动测试一:使用TestNG进行数据驱动
  14. codeforces-1202C-WASD-string
  15. Apache 防盗链(Apache Anti-Leech)技术的简单实现
  16. 使用selenium爬取fofa中的网站链接
  17. 微信小程序上传阿里云视频文件流程及代码
  18. 转盘游戏简单原理设计
  19. 基于springboot地方旅游系统的设计与实现
  20. Codeforces 1207 C. Gas Pipelin(线性DP)

热门文章

  1. 七牛云 转码_YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能
  2. echarts曲线太多卡顿怎么优化_光刻胶旋涂曲线如何获得?
  3. OpenShift 4 - 部署 RabbitMQ 集群
  4. OpenShift 4 - 安装 OpenShift 集群后如何删除节点或增加新节点
  5. (四)在MLOps管道中进行持续训练
  6. Steroids上的SQL Server Express Edition
  7. Microsoft Blazor——快速开发与SQL Forms开源平台Platz.SqlForms
  8. 使用.NET Core 3进行Linux编程:第3章
  9. 突发!美国国会发函要求 Facebook 立即停止 Libra 项目
  10. 相比 Windows 为什么越来越多人选择Linux?