依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
1.set注入
这是最简单的注入方式,假设有一个PersonServiceBean,类中需要实例化一个PersonDao对象,那么就可以定义一个private的PersonDao成员变量,然后创建PersonDao的set方法(这是ioc的注入入口):
1 public Class PersonServiceBean{ 2 //注入对象PersonDao 3 private PersonDao personDao; 4 //注入对象的setter方法 5 public void setPersonDao(PersonDao personDao){ 6 this.personDao = personDao; 7 } 8 public void save(Person person){ 9 personDao.save(person); 10 } 11 }
随后编写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配置:
1 <!--配置bean,配置后该类由spring管理--> 2 <bean name="personDao" class="cn.itcast.dao.impl.SpringDaoBean"></bean> 3 <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean"> 4 <!--(1)依赖注入,配置当前类中相应的属性--> 5 <property name="personDao" ref="personDao"></property> 6 </bean>
2.构造器注入
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量PersonDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在PersonServiceBean的构造函数中注入,也就是说在创建PersonServiceBean对象时要将PersonDao和User两个参数值传进来:
1 public class PersonServiceBean{ 2 private PersonDao personDao; 3 private User user; 4 public PersonServiceBean(PersonDao personDao,User user){ 5 this.personDao = personDao; 6 this.user = user; 7 system.out.println("构造方法调用personDao,user对象"); 8 } 9 public void save(){ 10 user.setName("哈哈"); 11 personDao.save(user); 12 } 13 }
在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:
1 <!--配置bean,配置后该类由spring管理--> 2 <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean"> 3 <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置--> 4 <constructor-arg ref="personDao"></constructor-arg> 5 <constructor-arg ref="user"></constructor-arg> 6 </bean> 7 <bean name="personDao" class="cn.itcast.dao.impl.personDaoBean"></bean> 8 <bean name="user" class="cn.itcast.vo.User"></bean>