依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们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. Session与Cookie

    Session与Cookie的比较 Cookie与Session都可以进行会话跟踪,但是实现的原理不太一样.一般情况下二者均可以满足需求,但有时候不可以使用Cookie,有时候不可以使用Session ...

  2. 《Java编程那点事儿》读书笔记(六)——异常处理

    1.抛出异常:throw 异常对象; 下面的代码是一个进制转换代码,可以转换为2进制和8进制,如果输入其他参数,则抛出异常. public static String transform(int va ...

  3. OpenJDK和OracleJDK的JVM性能有多大差距

    首先要先明确OpenJDK和Sun/OracleJDK之间,以及OpenJDK 6.OpenJDK 7.OpenJDK 7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的JD ...

  4. 如何配置LCD背光和LED,调试方法

    LCD背光和LED配置文件 alps/custom/<proj name>lk/cust_leds.c alps/custom/<proj name>/kernel/leds/ ...

  5. 《OD大数据实战》驴妈妈旅游网大型离线数据电商分析平台

    一.环境搭建 1. <OD大数据实战>Hadoop伪分布式环境搭建 2. <OD大数据实战>Hive环境搭建 3. <OD大数据实战>Sqoop入门实例 4. &l ...

  6. URAL1133. Fibonacci Sequence(二分)

    1133 刚开始还用记忆化推了下公式 后来发现数是非常大的 二分 然后就是精度错误 中间值会很大 乱七八糟的改 #include <iostream> #include<cstdio ...

  7. 使用Aspose.Cells组件生成Excel文件

    生成带表头的Excel文件,格式如下显示. 当然更复杂的一些也可以通过 合并单元格的方法 public void Merge(int firstRow, int firstColumn, int to ...

  8. 内核打上yaffs2补丁遇到的问题

    移植yaffs2文件系统时,首先要在内核中添加对yaffs2的支持,使用命令:./patch-ker.sh c 内核目录时,出现下面错误: usage:  ./patch-ker.sh  c/l m/ ...

  9. 封装sharedPreferences SettingsSPData

    /*************************************************************************** * 封装sharedPreferences S ...

  10. HDU 5273 Dylans loves numbers(水题)

    题意:给出一个0≤N≤1018,求其二进制中有几处是具有1的,假设相连的1只算1处,比如1101011就是3处. 思路:一个个数,当遇到第一个1时就将flag置为1:当遇到0就将flag置为0.当遇到 ...