spring依赖注入方法

  依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们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 index="0" type="cn.itcast.dao.personDao" ref="personDao"></constructor-arg>
5         <constructor-arg index="1" ref="user"></constructor-arg>
6     </bean>
7     <bean name="personDao" class="cn.itcast.dao.impl.personDaoBean"/>
8     <bean name="user" class="cn.itcast.vo.User"/>

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

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

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

另一种是设置参数类型:

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

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

或者参见此链接

 

posted @ 2015-05-25 15:42  别闹了  阅读(274)  评论(0编辑  收藏  举报