Spring2.5学习2.1_Spring两种依赖注入方法

使用Spring可以通过控制反转把依赖对象交给Spring管理,并把依赖对象通过外部容器动态的注入到组件内部。


下面将演示如何将依赖对象注入到组件中。

首先我们新建一个PersonDaoBean,然后将其注入到PersonServiceBean中。


PersonDaoBean.Java

package xjj.dao.impl;

import xjj.dao.PersonDao;
public class PersonDaoBean implements PersonDao {
	@Override
	public void add(){
		System.out.println("执行PersonDaoBean中的add()方法");
	}
}


由于我们是面对接口编程,抽取PersonDaoBean的接口类PersonDao:


PersonDao.java

package xjj.dao;

public interface PersonDao {

	public abstract void add();

}


如何将PersonDaoBean注入到PersonServiceBean中去的呢?


注入方式有两种:

第一种是根据构造器参数注入

第二种是使用属性的setter方法注入

当我们通过属性的setter方法注入时,一定不要忘了给属性添加setter方法。

package xjj.service.impl;

import xjj.dao.PersonDao;
import xjj.service.PersonService;

public class PersonServiceBean implements PersonService {
	private PersonDao personDao;
	
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}
	public PersonDao getPersonDao() {
		return personDao;
	}
	@Override
	public void save(){ 
		personDao.add();
    }  
}

通过引用dao层接口,来调用dao实现类的方法,这样实现了service层和dao层的彻底解耦。


当我们要为PersonServiceBean注入PersonDaoBean时,首先要把PersonDaoBean添加到Spring容器中去,然后通过bean的子元素property,实现属性注入


属性的名称是getPersonDao方法去掉get首字母小写,ref是需要注入的bean的名称(ID),Spring会根据名称从Spring容器中获取bean,然后把这个bean通过反射技术赋给了属性。

beans.xml

方式1:用ref属性

<?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="personDao" class="xjj.dao.impl.PersonDaoBean" ></bean>
          <bean id="personService" class="xjj.service.impl.PersonServiceBean" >
          	<property name="personDao" ref="personDao"></property>
          </bean>
</beans>

方式2:用内部bean

<?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="personService" class="xjj.service.impl.PersonServiceBean" >
          <property name="personDao" >
				<bean class="xjj.dao.impl.PersonDaoBean"/>          
          </property>
          </bean>
</beans>

问题:为什么在PersonServiceBean.java文件中添加带有参数的构造方法时,注入失败????

public PersonServiceBean(PersonDao personDao) {
this.personDao = personDao;
}

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService' defined in class path resource [beans.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [xjj.service.impl.PersonServiceBean]: <span style="color:#ff0000;">No default constructor found;</span> nested exception is java.lang.NoSuchMethodException: xjj.service.impl.PersonServiceBean.<init>()

原因:由于人为添加了带参数的构造方法

如果改成默认构造方法或者直接将构造方法删掉就不会出错了。


public PersonServiceBean() {
}


然后测试注入是否成功,我们在save方法中调用PersonDaoBean的add方法,如果注入不成功会出现空指针异常

SpringTest.java

package junit.test;


import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import xjj.service.PersonService;

public class SpringTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test
	public void test() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		PersonService personService = (PersonService) ctx.getBean("personService");
		personService.save();
	}

}

优缺点:采用第一种ref方式时,PersonDaoBean可以为多个bean服务,但是内部bean的方式,只能为一个bean服务。

测试结果:

技术分享


构造器注入:

PersonServiceBean.java

package xjj.service.impl;

import xjj.dao.PersonDao;
import xjj.service.PersonService;

public class PersonServiceBean implements PersonService {
	private PersonDao personDao;
	
	public PersonServiceBean(PersonDao personDao) {
		this.personDao = personDao;
	}
	@Override
	public void save(){ 
		personDao.add();
    }  
}


beans.xml

<bean id="personDao" class="xjj.dao.impl.PersonDaoBean" ></bean>
<bean id="personService" class="xjj.service.impl.PersonServiceBean" >
        <!--index=构造方法的参数位置(下标从0开始), type=注入的类型,ref=注入类在beans.xml中注册的ID -->  
	<constructor-arg index="0" type="xjj.dao.PersonDao" ref = "personDao"></constructor-arg>
</bean>

结果:技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。