(3) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理

前端之家收集整理的这篇文章主要介绍了(3) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. import@H_502_11@ cn.itm.dao.PersonDao; @H_502_11@@H_502_11@
  2. @H_502_11@
  3. @H_502_11@
  4. public@H_502_11@ @H_502_11@class@H_502_11@ PersonDaoBean @H_502_11@implements@H_502_11@ PersonDao { @H_502_11@@H_502_11@
  5. @H_502_11@
  6. @H_502_11@
  7. public@H_502_11@ @H_502_11@void@H_502_11@ add(){ @H_502_11@@H_502_11@
  8. System.out.println("执行PersonDaoBean的add方法。。。"@H_502_11@); @H_502_11@@H_502_11@
  9. } @H_502_11@
  10. } @H_502_11@



  1. package@H_502_11@ cn.itm.dao; @H_502_11@ @H_502_11@
  2. @H_502_11@
  3. public@H_502_11@ @H_502_11@interface@H_502_11@ PersonDao { @H_502_11@@H_502_11@
  4. @H_502_11@
  5. public@H_502_11@ @H_502_11@abstract@H_502_11@ @H_502_11@void@H_502_11@ add(); @H_502_11@@H_502_11@
  6. @H_502_11@
  7. } @H_502_11@


  1. package@H_502_11@ cn.itm.service.impl; @H_502_11@@H_502_11@
  2. @H_502_11@
  3. import@H_502_11@ cn.itm.dao.PersonDao; @H_502_11@@H_502_11@
  4. import@H_502_11@ cn.itm.service.PersonService; @H_502_11@@H_502_11@
  5. @H_502_11@
  6. public@H_502_11@ @H_502_11@class@H_502_11@ PersonServiceBean @H_502_11@implements@H_502_11@ PersonService{ @H_502_11@@H_502_11@
  7. @H_502_11@
  8. @H_404_216@// 使用 Set方法 是实现依赖注入:@H_502_11@ @H_502_11@@H_502_11@
  9. private@H_502_11@ PersonDao personDao; @H_502_11@@H_502_11@
  10. @H_502_11@
  11. @H_502_11@
  12. public@H_502_11@ @H_502_11@void@H_502_11@ setPersonDao(PersonDao personDao) { @H_502_11@@H_502_11@
  13. this@H_502_11@.personDao = personDao; @H_502_11@@H_502_11@
  14. } @H_502_11@
  15. @H_502_11@
  16. @H_502_11@
  17. public@H_502_11@ @H_502_11@void@H_502_11@ save(){ @H_502_11@@H_502_11@
  18. @H_404_216@// 调用 依赖对象注入进来的方法了。@H_502_11@ @H_502_11@ @H_502_11@
  19. personDao.add(); @H_502_11@
  20. } @H_502_11@
  21. @H_502_11@
  22. } @H_502_11@


  1. package@H_502_11@ cn.itm.service; @H_502_11@@H_502_11@
  2. @H_502_11@
  3. public@H_502_11@ @H_502_11@interface@H_502_11@ PersonService { @H_502_11@@H_502_11@
  4. @H_502_11@
  5. public@H_502_11@ @H_502_11@abstract@H_502_11@ @H_502_11@void@H_502_11@ save(); @H_502_11@@H_502_11@
  6. @H_502_11@
  7. } @H_502_11@

  1. <?xml version=@H_502_11@"1.0"@H_502_11@ encoding=@H_502_11@"UTF-8"@H_502_11@?> @H_502_11@@H_502_11@
  2. <beans xmlns="http://www.springframework.org/schema/beans"@H_502_11@ @H_502_11@@H_502_11@
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"@H_502_11@ @H_502_11@@H_502_11@
  4. xsi:schemaLocation="http:@H_404_216@//www.springframework.org/schema/beans@H_502_11@ @H_502_11@@H_502_11@
  5. http:@H_404_216@//www.springframework.org/schema/beans/spring-beans-2.5.xsd">@H_502_11@ @H_502_11@@H_502_11@
  6. @H_502_11@
  7. <bean id="personDao"@H_502_11@ @H_502_11@class@H_502_11@=@H_502_11@"cn.itm.dao.impl.PersonDaoBean"@H_502_11@></bean> @H_502_11@@H_502_11@
  8. @H_502_11@
  9. <bean id="personService"@H_502_11@ @H_502_11@class@H_502_11@=@H_502_11@"cn.itm.service.impl.PersonServiceBean"@H_502_11@ > @H_502_11@@H_502_11@
  10. <!-- 实现 注入 --> @H_502_11@
  11. <property name="personDao"@H_502_11@ ref=@H_502_11@"personDao"@H_502_11@></property> @H_502_11@@H_502_11@
  12. </bean> @H_502_11@
  13. @H_502_11@
  14. @H_502_11@
  15. </beans> @H_502_11@


测试类:@H_502_11@

  1. package@H_502_11@ junit.test; @H_502_11@ @H_502_11@
  2. @H_502_11@
  3. @H_502_11@
  4. import@H_502_11@ org.junit.BeforeClass; @H_502_11@ @H_502_11@
  5. import@H_502_11@ org.junit.Test; @H_502_11@ @H_502_11@
  6. import@H_502_11@ org.springframework.context.ApplicationContext; @H_502_11@@H_502_11@
  7. import@H_502_11@ org.springframework.context.support.ClassPathXmlApplicationContext; @H_502_11@@H_502_11@
  8. @H_502_11@
  9. import@H_502_11@ cn.itm.service.PersonService; @H_502_11@@H_502_11@
  10. @H_502_11@
  11. public@H_502_11@ @H_502_11@class@H_502_11@ SpringTest { @H_502_11@@H_502_11@
  12. @H_502_11@
  13. @BeforeClass@H_502_11@ @H_502_11@ @H_502_11@
  14. public@H_502_11@ @H_502_11@static@H_502_11@ @H_502_11@void@H_502_11@ setUpBeforeClass() @H_502_11@throws@H_502_11@ Exception { @H_502_11@@H_502_11@
  15. } @H_502_11@
  16. @H_502_11@
  17. @H_404_216@// 专门用来实例化 Spring 容器的。@H_502_11@ @H_502_11@@H_502_11@
  18. @Test@H_502_11@ @H_502_11@public@H_502_11@ @H_502_11@void@H_502_11@ instanceSpring(){ @H_502_11@@H_502_11@
  19. @H_502_11@
  20. ApplicationContext ctx = new@H_502_11@ ClassPathXmlApplicationContext(@H_502_11@"beans.xml"@H_502_11@); @H_502_11@@H_502_11@
  21. PersonService personService = (PersonService) ctx.getBean("personService"@H_502_11@); @H_502_11@@H_502_11@
  22. personService.save(); @H_502_11@
  23. @H_502_11@
  24. } @H_502_11@
  25. } @H_502_11@

成功。@H_502_11@


利用setter方式的好处:可以被多个bean使用。@H_502_11@



下面利用编码剖析Spring依赖注入的原理:@H_502_11@@H_502_11@


  1. package@H_502_11@ junit.test; @H_502_11@ @H_502_11@
  2. @H_502_11@
  3. @H_502_11@
  4. import@H_502_11@ java.beans.Introspector; @H_502_11@ @H_502_11@
  5. import@H_502_11@ java.beans.PropertyDescriptor; @H_502_11@@H_502_11@
  6. import@H_502_11@ java.lang.reflect.Method; @H_502_11@ @H_502_11@
  7. import@H_502_11@ java.net.URL; @H_502_11@ @H_502_11@
  8. import@H_502_11@ java.util.ArrayList; @H_502_11@ @H_502_11@
  9. import@H_502_11@ java.util.HashMap; @H_502_11@@H_502_11@
  10. import@H_502_11@ java.util.List; @H_502_11@@H_502_11@
  11. import@H_502_11@ java.util.Map; @H_502_11@ @H_502_11@
  12. @H_502_11@
  13. import@H_502_11@ org.dom4j.Document; @H_502_11@@H_502_11@
  14. import@H_502_11@ org.dom4j.Element; @H_502_11@@H_502_11@
  15. import@H_502_11@ org.dom4j.XPath; @H_502_11@@H_502_11@
  16. import@H_502_11@ org.dom4j.io.SAXReader; @H_502_11@ @H_502_11@
  17. @H_502_11@
  18. public@H_502_11@ @H_502_11@class@H_502_11@ ItmClassPathXMLApplicationContext { @H_502_11@@H_502_11@
  19. @H_502_11@
  20. private@H_502_11@ List<BeanDefinition> beanDefines = @H_502_11@new@H_502_11@ ArrayList<BeanDefinition>(); @H_502_11@ @H_502_11@
  21. @H_404_216@// 存放实例@H_502_11@ @H_502_11@@H_502_11@
  22. private@H_502_11@ Map<String,Object> sigletons = @H_502_11@new@H_502_11@ HashMap<String,Object>(); @H_502_11@@H_502_11@
  23. @H_502_11@
  24. public@H_502_11@ ItmClassPathXMLApplicationContext(String fileName){ @H_502_11@@H_502_11@
  25. this@H_502_11@.readXML(fileName); @H_502_11@@H_502_11@
  26. this@H_502_11@.instanceBeans(); @H_502_11@ @H_502_11@
  27. this@H_502_11@.injectObject(); @H_502_11@@H_502_11@
  28. } @H_502_11@
  29. @H_502_11@
  30. private@H_502_11@ @H_502_11@void@H_502_11@ injectObject() { @H_502_11@@H_502_11@
  31. for@H_502_11@(BeanDefinition beanDefinition : beanDefines){ @H_502_11@@H_502_11@
  32. @H_404_216@// 得到 bean 。。@H_502_11@ @H_502_11@@H_502_11@
  33. Object bean = sigletons.get(beanDefinition.getId()); @H_502_11@
  34. if@H_502_11@(bean != @H_502_11@null@H_502_11@){ @H_502_11@@H_502_11@
  35. try@H_502_11@ { @H_502_11@ @H_502_11@
  36. @H_404_216@// 得到 bean的属性描述:@H_502_11@ @H_502_11@@H_502_11@
  37. PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); @H_502_11@
  38. @H_404_216@// 循环 bean里面的 所有的属性:@H_502_11@ @H_502_11@@H_502_11@
  39. for@H_502_11@( PropertyDefinition propertyDefinition: beanDefinition.getPropertys()){ @H_502_11@@H_502_11@
  40. for@H_502_11@(PropertyDescriptor propertyDesc @H_502_11@@H_404_216@/*这里是 bean 里面的属性*/@H_502_11@ : ps){ @H_502_11@@H_502_11@
  41. if@H_502_11@(propertyDefinition.getName().equals(propertyDesc.getName())){ @H_502_11@@H_502_11@
  42. @H_404_216@// 如果相等 说明是存在 于 这个bean的。。。@H_502_11@ @H_502_11@@H_502_11@
  43. Method setter = propertyDesc.getWriteMethod(); @H_404_216@// 获取属性的 setter方法。@H_502_11@ @H_502_11@@H_502_11@
  44. @H_404_216@// 最好做一下判断:@H_502_11@ @H_502_11@@H_502_11@
  45. if@H_502_11@(setter != @H_502_11@null@H_502_11@){ @H_502_11@@H_502_11@
  46. Object value = sigletons.get(propertyDefinition.getRef()); @H_502_11@
  47. setter.setAccessible(true@H_502_11@); @H_502_11@@H_404_216@// 允许访问 私有的方法。。@H_502_11@ @H_502_11@@H_502_11@
  48. setter.invoke(bean,value);@H_404_216@// 把引用对象注入到属性。@H_502_11@ @H_502_11@@H_502_11@
  49. } @H_502_11@
  50. break@H_502_11@; @H_502_11@@H_502_11@
  51. } @H_502_11@
  52. } @H_502_11@
  53. } @H_502_11@
  54. } catch@H_502_11@ (Exception e) { @H_502_11@@H_502_11@
  55. e.printStackTrace(); @H_502_11@
  56. } @H_502_11@
  57. } @H_502_11@
  58. } @H_502_11@
  59. } @H_502_11@
  60. @H_502_11@
  61. @H_404_216@/**@H_502_11@ @H_502_11@
  62. @H_404_216@ * 通过反射技术,完成 bean 的实例化:@H_502_11@ @H_502_11@
  63. @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
  64. private@H_502_11@ @H_502_11@void@H_502_11@ instanceBeans() { @H_502_11@@H_502_11@
  65. for@H_502_11@(BeanDefinition beanDefinition : beanDefines){ @H_502_11@@H_502_11@
  66. try@H_502_11@ { @H_502_11@@H_502_11@
  67. if@H_502_11@(beanDefinition.getClassName() != @H_502_11@null@H_502_11@ && !@H_502_11@""@H_502_11@.equals(beanDefinition.getClassName().trim())){ @H_502_11@@H_502_11@
  68. sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance()); @H_502_11@
  69. } @H_502_11@
  70. } catch@H_502_11@ (Exception e) { @H_502_11@@H_502_11@
  71. e.printStackTrace(); @H_502_11@
  72. } @H_502_11@
  73. } @H_502_11@
  74. @H_502_11@
  75. } @H_502_11@
  76. @H_502_11@
  77. @H_502_11@
  78. @H_502_11@
  79. @H_404_216@/**@H_502_11@ @H_502_11@
  80. @H_404_216@ * 读取 XML 的配置文件:@H_502_11@ @H_502_11@
  81. @H_404_216@ * @param fileName@H_502_11@ @H_502_11@
  82. @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
  83. @SuppressWarnings@H_502_11@(@H_502_11@"unchecked"@H_502_11@) @H_502_11@@H_502_11@
  84. private@H_502_11@ @H_502_11@void@H_502_11@ readXML(String fileName) { @H_502_11@@H_502_11@
  85. @H_404_216@// 创建读取器:@H_502_11@ @H_502_11@ @H_502_11@
  86. SAXReader saxReader = new@H_502_11@ SAXReader(); @H_502_11@@H_502_11@
  87. Document document = null@H_502_11@; @H_502_11@@H_502_11@
  88. @H_502_11@
  89. try@H_502_11@{ @H_502_11@@H_502_11@
  90. URL xmlPath = this@H_502_11@.getClass().getClassLoader().getResource(fileName); @H_502_11@@H_502_11@
  91. document = saxReader.read(xmlPath); @H_404_216@ // 读取文件内容。。。@H_502_11@ @H_502_11@@H_502_11@
  92. @H_502_11@
  93. Map<String,String> nsMap = new@H_502_11@ HashMap<String,String>(); @H_502_11@@H_502_11@
  94. nsMap.put("ns"@H_502_11@,@H_502_11@"http://www.springframework.org/schema/beans"@H_502_11@); // 加入命名空间 @H_502_11@@H_502_11@
  95. @H_502_11@
  96. @H_404_216@// 创建beans/bean 查询路径。@H_502_11@ @H_502_11@ @H_502_11@
  97. XPath xsub = document.createXPath("//ns:beans/ns:bean"@H_502_11@); @H_502_11@@H_502_11@
  98. @H_502_11@
  99. @H_404_216@// 设置命名空间。@H_502_11@ @H_502_11@ @H_502_11@
  100. xsub.setNamespaceURIs(nsMap); @H_502_11@
  101. @H_502_11@
  102. @H_404_216@// 获取文档下 所有bean节点:@H_502_11@ @H_502_11@ @H_502_11@
  103. List<Element> beans = xsub.selectNodes(document); @H_502_11@
  104. for@H_502_11@(Element element : beans){ @H_502_11@@H_502_11@
  105. String id = element.attributeValue("id"@H_502_11@); @H_502_11@@H_404_216@// 获取id属性值。@H_502_11@ @H_502_11@@H_502_11@
  106. String clazz = element.attributeValue("class"@H_502_11@); @H_502_11@@H_404_216@// 获取 class 属性值。@H_502_11@ @H_502_11@@H_502_11@
  107. BeanDefinition beanDefine = new@H_502_11@ BeanDefinition(id,clazz); @H_502_11@@H_502_11@
  108. @H_502_11@
  109. @H_404_216@// 查询的相对路径:@H_502_11@ @H_502_11@@H_502_11@
  110. XPath propertysub = element.createXPath("ns:property"@H_502_11@); @H_502_11@@H_502_11@
  111. propertysub.setNamespaceURIs(nsMap);@H_404_216@// 设置命名空间。@H_502_11@ @H_502_11@@H_502_11@
  112. @H_502_11@
  113. List<Element> propertys = propertysub.selectNodes(element); @H_502_11@
  114. for@H_502_11@(Element property : propertys){ @H_502_11@@H_502_11@
  115. String propertyName = property.attributeValue("name"@H_502_11@); @H_502_11@@H_502_11@
  116. String propertyRef = property.attributeValue("ref"@H_502_11@); @H_502_11@@H_502_11@
  117. System.out.println(propertyName + "=="@H_502_11@ + propertyRef); @H_502_11@@H_502_11@
  118. PropertyDefinition propertyDefinition = new@H_502_11@ PropertyDefinition(propertyName,propertyRef); @H_502_11@@H_502_11@
  119. @H_502_11@
  120. @H_404_216@// 放到 bean里面去:@H_502_11@ @H_502_11@@H_502_11@
  121. beanDefine.getPropertys().add(propertyDefinition); @H_502_11@
  122. @H_502_11@
  123. } @H_502_11@
  124. beanDefines.add(beanDefine); @H_502_11@
  125. } @H_502_11@
  126. @H_502_11@
  127. }catch@H_502_11@(Exception e){ @H_502_11@@H_502_11@
  128. e.printStackTrace(); @H_502_11@
  129. } @H_502_11@
  130. } @H_502_11@
  131. @H_502_11@
  132. @H_502_11@
  133. @H_404_216@/**@H_502_11@ @H_502_11@
  134. @H_404_216@ * 获取 bean实例@H_502_11@ @H_502_11@
  135. @H_404_216@ * @param beanName@H_502_11@ @H_502_11@
  136. @H_404_216@ * @return@H_502_11@ @H_502_11@
  137. @H_404_216@ */@H_502_11@ @H_502_11@@H_502_11@
  138. public@H_502_11@ Object getBean(String beanName){ @H_502_11@@H_502_11@
  139. return@H_502_11@ @H_502_11@this@H_502_11@.sigletons.get(beanName); @H_502_11@@H_502_11@
  140. } @H_502_11@
  141. @H_502_11@
  142. } @H_502_11@

原文链接:https://www.f2er.com/javaschema/286743.html

猜你在找的设计模式相关文章