Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
使用构造器注入
| 
 1 
2 
3 
4 
 | 
 <constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//构造器注入 
<bean id="xxx" class="daoimpl.PersonDaoImpl"></bean> 
<constructor-arg index=“0” type=“java.lang.String” ref=“xxx”/>//构造器注入 
 | 
PS:其中index的值代表构造器的第几个参数,type代表属性类型,value的值的类型为基本类型,ref的值为引用bean的名字。
范例:
配置文件:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
 | 
 <?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"> 
           <bean id="persondaoimpl" class="daoimpl.PersonDaoImpl"></bean> 
           <bean id="personService" class="zmc.PersonServicebean" > 
               <constructor-arg index="0" type="java.lang.String" value="zmcheng"></constructor-arg> 
               <constructor-arg index="1" type="dao.PersonDao" ref="persondaoimpl"></constructor-arg> 
           </bean> 
</beans> 
 | 
依赖对象类:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
 | 
 package zmc; 
import dao.PersonDao; 
import zmcjk.PersonService; 
public class PersonServicebean implements PersonService { 
  private String name; 
  private PersonDao personDao ; 
  public PersonServicebean(String name, PersonDao personDao) { 
      super(); 
      this.name = name; 
      this.personDao = personDao; 
} 
  public String getName() { 
    return name; 
} 
  public void setName(String name) { 
   this.name = name; 
} 
public PersonDao getPersonDao() { 
   return personDao; 
} 
public void setPersonDao(PersonDao personDao) { 
    this.personDao = personDao; 
} 
public void save(){ 
   System.out.println(this.name); 
   personDao.add(); 
} 
} 
 | 
使用属性setter方法注入
基本类型对象注入:
| 
 1 
2 
3 
 | 
 <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> 
    <property name=“name” value=“zhao”/> 
</bean> 
 | 
示例:
配置文件:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
 | 
 <?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"> 
           <bean id="persondaoimpl" class="daoimpl.PersonDaoImpl"></bean> 
           <bean id="personService" class="zmc.PersonServicebean" > 
               <property name="name" value="zmc"></property> 
               <property name="age" value="88"></property> 
               <property name="persondao" ref="persondaoimpl"></property> 
           </bean> 
</beans> 
 | 
bean类:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
 | 
 package zmc; 
import dao.PersonDao; 
import zmcjk.PersonService; 
public class PersonServicebean implements PersonService { 
private PersonDao persondao  = null; 
private String name=null; 
private Integer age; 
public Integer getAge() { 
return age; 
} 
public void setAge(Integer age) { 
this.age = age; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public PersonDao getPersondao() { 
return persondao; 
} 
public void setPersondao(PersonDao persondao) { 
this.persondao = persondao; 
} 
public void save(){ 
System.out.println(this.name); 
System.out.println(this.age); 
persondao.add(); 
} 
} 
 | 
注入其他bean:
方式一
| 
 1 
2 
3 
4 
 | 
 <bean id="orderDao" class="cn.itcast.service.OrderDaoBean"/> 
<bean id="orderService" class="cn.itcast.service.OrderServiceBean"> 
<property name="orderDao" ref="orderDao"/> 
</bean> 
 | 
PS:其中name为属性名称,ref是要注入bean的名称
示例:
DAO层:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
 | 
 package dao; 
public interface PersonDao { 
void add(); 
} 
package daoimpl; 
import dao.PersonDao; 
public class PersonDaoImpl implements PersonDao { 
public void add(){ 
     System.out.println("执行dao的方法"); 
    } 
} 
 | 
业务层:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
 package zmc; 
import dao.PersonDao; 
import zmcjk.PersonService; 
public class PersonServicebean implements PersonService { 
private PersonDao persondao  = null; 
public PersonDao getPersondao() { 
return persondao; 
} 
public void setPersondao(PersonDao persondao) { 
this.persondao = persondao; 
} 
public void save(){ 
persondao.add(); 
} 
} 
 | 
测试:
| 
 1 
2 
3 
4 
 | 
 AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
PersonService ps = (PersonService)ctx.getBean("personService"); 
ps.save(); 
ctx.close(); 
 | 
配置文件:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
 | 
 <?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"> 
           <bean id="persondaoimpl" class="daoimpl.PersonDaoImpl"></bean> 
           <bean id="personService" class="zmc.PersonServicebean" > 
              <property name="persondao" ref="persondaoimpl"></property> 
           </bean> 
</beans> 
 | 
测试结果:执行dao的方法
方式二(使用内部bean,但该bean不能被其他bean使用,不推荐)
| 
 1 
2 
3 
4 
5 
 | 
 <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> 
<property name="orderDao"> 
<bean class="cn.itcast.service.OrderDaoBean"/> 
</property> 
</bean> 
 | 
集合类型的装配:
Spring可以对集合类型进行注入包括:Set集合,properties属性集合,Map集合以及List集合。
注入方式如下:
配置文件:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
 | 
 <bean id="order" class="cn.itcast.service.OrderServiceBean"> 
    <property name="lists"> 
          <list> 
              <value>lihuoming</value> 
               <value>zmcheng</value> 
         </list> 
      </property> 
      <property name="sets"> 
         <set> 
            <value>set1</value> 
             <value>set2</value> 
        </set> 
      </property> 
      <property name="maps"> 
        <map> 
            <entry key="lihuoming" value="28"/> 
            <entry key="zmcheng" value="22"/> 
       </map> 
     </property> 
     <property name="properties"> 
        <props> 
             <prop key="12">sss</prop> 
             <prop key="13">saa</prop> 
       </props> 
      </property> 
</bean> 
 | 
编码模拟Spring使用属性setter方法注入的原理:
简单模拟的Spring容器:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
 | 
 package zmcSpring; 
import java.beans.IntrospectionException; 
import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.dom4j.Document; 
import org.dom4j.Element; 
import org.dom4j.XPath; 
import org.dom4j.io.SAXReader; 
/* 
 * 简单模拟Spring容器 
 */ 
public class ZmcClassPathXMLApplicationContext { 
private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();//保存bean的信息 
private Map<String,Object> sigletons = new HashMap<String,Object>();//引用所有bean对象 
public ZmcClassPathXMLApplicationContext(String fileName){ 
this.readXML(fileName); 
this.instanceBeans(); 
this.injectObject();//依赖注入 
} 
/* 
 * 为bean属性注入值 
 */ 
private void injectObject() { 
   for(BeanDefinition beanDefinition : beanDefines){ 
       Object bean = sigletons.get(beanDefinition.getId());//此时bean还没有注入 
       //下面开始进行依赖注入 
       if(bean!=null){ 
         //取得bean的属性描述 
       try { 
        PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();//bean的属性 
        for(PropertyDefinition propertyDefinition : beanDefinition.getProperty()){//用户配置文件中定义的属性 
         for(PropertyDescriptor properdesc : ps){ 
       //判断配置文件中属性的名称和bean中属性的名称是否相同 
        if(propertyDefinition.getName().equals(properdesc.getName())){ 
               Method setter = properdesc.getWriteMethod();//获得属性的setter方法 
               if(setter!=null){ 
               Object value = sigletons.get(propertyDefinition.getRef()); 
               try { 
                  setter.invoke(bean, value); 
                } catch (Exception e) { 
                   e.printStackTrace(); 
              } //把引用对象注入到属性 
}}}}} 
catch(Exception e){ 
.... 
} 
/* 
 * 完成bean的实例化 
 */ 
private void instanceBeans(){ 
for(BeanDefinition beanDefinition : beanDefines){ 
try { 
sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance()); 
} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}  
} 
} 
/* 
 * 读取XMl配置文件 
 * @param filename 
 */ 
public void readXML(String fileName){ 
SAXReader saxReader = new SAXReader(); 
Document document = null; 
try{ 
URL xmlpath = this.getClass().getClassLoader().getResource(fileName); 
document = saxReader.read(xmlpath); 
Map<String,String> nsMap = new HashMap<String,String>(); 
nsMap.put("ns", "http://www.springframework.org/schema/beans");//加入命名空间 
XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径 
    xsub.setNamespaceURIs(nsMap);//设置命名空间 
    List<Element> beans = xsub.selectNodes(document); 
    for(Element element : beans){ 
       String id = element.attributeValue("id"); 
       String clazz = element.attributeValue("class"); 
       BeanDefinition beanDefinition = new BeanDefinition(id,clazz); 
      XPath propertysub =  element.createXPath("ns:property");//nodename(节点名称):表示选择该节点的所有子节点 
     propertysub.setNamespaceURIs(nsMap); 
     List<Element> propertys = propertysub.selectNodes(element); 
     for(Element property:propertys){ 
     String propertyName = property.attributeValue("name"); 
     String propertyRef = property.attributeValue("ref"); 
     PropertyDefinition pd = new PropertyDefinition(propertyName, propertyRef); 
     beanDefinition.getProperty().add(pd); 
     } 
      beanDefines.add(beanDefinition); 
    } 
} 
catch (Exception e){ 
e.printStackTrace(); 
} 
} 
/* 
 *获取bean实例 
 */ 
public Object getBean(String beanName){ 
return this.sigletons.get(beanName); 
} 
} 
 | 
Bean属性信息:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
 | 
 package zmcSpring; 
import java.util.ArrayList; 
import java.util.List; 
public class BeanDefinition { 
private String id; 
private String className; 
private List<PropertyDefinition> property = new ArrayList<PropertyDefinition>(); 
public List<PropertyDefinition> getProperty() { 
return property; 
} 
public void setProperty(List<PropertyDefinition> property) { 
this.property = property; 
} 
public BeanDefinition() { 
  super(); 
} 
public BeanDefinition(String id, String className) { 
super(); 
this.id = id; 
this.className = className; 
} 
public String getId() { 
return id; 
} 
public void setId(String id) { 
this.id = id; 
} 
public String getClassName() { 
return className; 
} 
public void setClassName(String className) { 
this.className = className; 
} 
} 
 | 
Property信息:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
 | 
 package zmcSpring; 
public class PropertyDefinition { 
 public PropertyDefinition(String name, String ref) { 
super(); 
this.name = name; 
this.ref = ref; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public String getRef() { 
return ref; 
} 
public void setRef(String ref) { 
this.ref = ref; 
} 
private String name; 
 private String ref; 
} 
 | 
测试类:
Java
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
 @Test 
public void T() { 
ZmcClassPathXMLApplicationContext zmc = new ZmcClassPathXMLApplicationContext("beans.xml"); 
PersonService ps = (PersonService)zmc.getBean("personService"); 
ps.save(); 
} 
 | 
Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入的更多相关文章
- spring 构造方法注入和setter方法注入的XML表达
		
1.构造方法注入 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC ...
 - 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?
		
你两种依赖方式都可以使用,构造器注入和Setter方法注入.最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖.
 - spring  setter方法注入
		
<bean id="dao" class="Dao"></bean> <bean id="service" c ...
 - SpringBoot 构造器注入、Setter方法注入和Field注入对比
		
0. 引入 今天在看项目代码的时候发现在依赖注入的时候使用了构造器注入,之前使用过 Field 注入和 Setter 方法注入,对构造器注入不是很了解.经过查阅资料看到,Spring 推荐使用构造器注 ...
 - .NET手记-Autofac进阶(属性和方法注入 Property and Method Injection)
		
尽管构造函数参数注入是传递参数值给当前构造的组件的优先方式,但是你也可以使用属性或者方法注入来提供参数值. 属性注入使用可写入的变量而不是构造函数参数来完成注入.方法注入则通过方法来设置依赖项. 属性 ...
 - Autofac官方文档翻译--一、注册组件--3属性和方法注入
		
官方文档:http://docs.autofac.org/en/latest/register/prop-method-injection.html Autofac 属性和方法注入 虽然构造函数参数注 ...
 - Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理
		
注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 手工装配依赖对象 手工装配依赖对象,在这种方式中又有两种编 ...
 - spring构造函数注入、setter方法注入和接口注入
		
Spring开发指南中所说的三种注入方式: Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA { private InterfaceB clz ...
 - spring 3.1.13中新增的util @value注解,给类或方法注入值
		
在spring 3.0以上版本中,可以通过使用@value,对一些如xxx.properties文件 ,进行键值对的注入,例子如下: 一.类变量注入 1 首先在applicationContext.x ...
 
随机推荐
- 扩展-Easyui Datagrid相同连续列合并扩展(一)
			
一.autoMergeCellAndCells实现效果 调用方法: function onLoadSuccess(data){ $(this).datagrid("autoMerge ...
 - HttpHandler简单示例
			
using System.Web; namespace MyWebApp { public class MyHttpHandler : IHttpHandler { public void Proce ...
 - 神经网络Batch Normalization——学习笔记
			
训练神经网络的过程,就是在求未知参数(权重).让网络搭建起来,得到理想的结果. 分类-监督学习. 反向传播求权重:每一层在算偏导数.局部梯度,链式法则. 激活函数: sigmoid仅中间段趋势良好 对 ...
 - 经验总结20--C#模拟WEB请求
			
非常多语言能够使用代码进行WEB请求,获取到须要的数据. 方便调用别人的接口,自己进行处理. HttpWebRequest request = WebRequest.Create(url) as Ht ...
 - 运维角度浅谈:MySQL数据库优化
			
日志君导读: 一个成熟的数据库架构并非一開始设计就具备高可用.高伸缩等特性的.它是随着用户量的添加,基础架构才逐渐完好. 作者:zhenliang8.本文转自51CTO博客,点击原文阅读查看网页版文章 ...
 - leetcode -- Permutations II TODO
			
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
 - __file__
			
__file__ 是 python 的内置变量它的值等于文件名本身 [root@localhost ~]$ cat test.py #!/usr/bin/env python print(__file ...
 - 适配iOS 8备忘录 开始启动(持续更新。。。1130)
			
本文转载至 http://www.cocoachina.com/bbs/read.php?tid=229352 PS:大家都说看到那么多图标很头痛,我来给大家解决这个问题:直接下载我的这个包Image ...
 - 利用MFC实现浏览器的定制与扩展(JavaScript与C++交互)
			
原文地址:http://www.vckbase.com/document/viewdoc/?id=1486 浏览器的定制与扩展 作者:李汉鹏 下载源代 码 本文分如下章节: 前 言 在 ...
 - 桌面不显示IE图标解决方法
			
如果你的是WIN7,恰好你的桌面上IE图标不知道怎么被搞咩了. 向这里看过来,这里有一个文件你正好能用上. 使用方法很简单: 猛戳下载,猛戳两下安装 下载解决