依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

  spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:

1.set注入

  这是最简单的注入方式,假设有一个PersonServiceBean,类中需要实例化一个PersonDao对象,那么就可以定义一个private的PersonDao成员变量,然后创建PersonDao的set方法(这是ioc的注入入口):

 public Class PersonServiceBean{
//注入对象PersonDao
private PersonDao personDao;
//注入对象的setter方法
public void setPersonDao(PersonDao personDao){
this.personDao = personDao;
}
public void save(Person person){
personDao.save(person);
}
}

  随后编写spring的xml文件,<bean>中的name属性是class属性的一个别名,class属性指类的全名,因为在PersonServiceBean中有一个公共属性PersonDao,所以要在<bean>标签中创建一个<property>标签指定PersonDao。<property>标签中的name就是PersonServiceBean类中的PersonDao属性名,ref指下面<bean name="personDao"...>,这样其实是spring将PersonDaoImpl对象实例化并且调用PersonServiceBean的setPersonDao方法将PersonDao注入

beans.xml配置:

 <!--配置bean,配置后该类由spring管理-->
<bean name="personDao" class="cn.itcast.dao.impl.SpringDaoBean"></bean>
<bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
<!--(1)依赖注入,配置当前类中相应的属性-->
<property name="personDao" ref="personDao"></property>
</bean>

2.构造器注入

这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量PersonDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在PersonServiceBean的构造函数中注入,也就是说在创建PersonServiceBean对象时要将PersonDao和User两个参数值传进来:

 public class PersonServiceBean{
private PersonDao personDao;
private User user;
public PersonServiceBean(PersonDao personDao,User user){
this.personDao = personDao;
this.user = user;
system.out.println("构造方法调用personDao,user对象");
}
public void save(){
user.setName("哈哈");
personDao.save(user);
}
}

在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:

 <!--配置bean,配置后该类由spring管理-->
<bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
<!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
<constructor-arg index="0" type="cn.itcast.dao.personDao" ref="personDao"></constructor-arg>
<constructor-arg index="1" ref="user"></constructor-arg>
</bean>
<bean name="personDao" class="cn.itcast.dao.impl.personDaoBean"/>
<bean name="user" class="cn.itcast.vo.User"/>

解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:

  下面是设置index,就是参数位置:

 <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
<constructor-arg index="0" ref="personDao"></constructor-arg>
<constructor-arg index="1" ref="user"></constructor-arg>
</bean>

另一种是设置参数类型:

 <constructor-arg type="java.lang.String" ref=""/>

静态工厂方法和实例化工厂方法

或者参见此链接

spring依赖注入方法的更多相关文章

  1. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  2. Spring依赖注入的Setter注入(通过get和set方法注入)

    Spring依赖注入的Setter注入(通过get和set方法注入) 导入必要的jar包(Spring.jar和commonslogging.jar) 在src目录下建立applicationCont ...

  3. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  4. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  5. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  6. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  7. Spring依赖注入 --- 模拟实现

    Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处 ...

  8. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  9. Spring、Spring依赖注入与编码剖析Spring依赖注入的原理

    Spring依赖注入 新建PersonIDao 和PersonDao底实现Save方法: public interface PersonIDao { public void save(); } pub ...

随机推荐

  1. [转载]破解TexturePacker加密资源

    最近我们要开一个新项目,UI与交互打算借鉴当前正火的<圣火英雄传>,程序开发为了和美术制作并行,打算用圣火的资源暂代使用.我解压圣火apk,发现用TexturePacker命令行无法把它的 ...

  2. Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法

    Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...

  3. 【温故知新】C#委托delegate

    在c#的学习过程中,学到委托与事件总会迷糊一段时间,迷糊过后自然而就似懂非懂了~,所以最近我打算把以前所学的迷糊过的知识总结,温故知新,总结记录下来. 首先,我们来看一下msdn对委托的定义: del ...

  4. aptana studio 3支持jquery

    首先要说的一点是,如果你不使用PortableGit,就不要安装,否则New From Template中会缺失大部分模板.至于还有什么缺陷,暂时没测出来,本人也是刚玩aptana studio 3哈 ...

  5. 导出excel小结(C#,.NET,Wpf)

    range.NumberFormatLocal = "@";     //设置单元格格式为文本      range.NumberFormatLocal = "@&quo ...

  6. HTML xmlns

    xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属性所在元素内的所有 ...

  7. HDU 5317 RGCDQ (质数筛法,序列)

    题意:从1~1000,000的每个自然数质因子分解,不同因子的个数作为其f 值,比如12=2*2*3,则f(12)=2.将100万个数转成他们的f值后变成新的序列seq.接下来T个例子,每个例子一个询 ...

  8. 多核模糊C均值聚类

    摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...

  9. Heritrix源码分析(三) 修改配置文件order.xml加快你的抓取速度(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/629891       本博客已迁移到本人独立博客: http://www.yun5u ...

  10. 【转】session setup failed: NT_STATUS_LOGON_FAILURE -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_5cdb72780100l26f.html samba服务器出现“session setup failed: NT_STATUS ...