beans.xml配置文件
<?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">
<!-- IOC控制反转的原理演示 -->
<bean id="persondao" class="cn.itcast.dao.impl.PersonDaoBean">
</bean>
<bean id="personservice5" class="cn.itcast.service.impl.PersonServiceBean" >
<!-- 这里运用java的反射机制,将生成的bean组件(persondao)中的方法,映射给ipersondao,
也就是 在PersonServiceBean中只要建一个persondao相关接口的引用就能调用到实现了这个接口的类中的方法-->
<property name="ipersondao" ref="persondao"></property>
</bean>
</beans>
cn.itcast.dao.impl包下的两个java文件
package cn.itcast.dao.impl;
public interface IPersonDao {
public abstract void add();
}
package cn.itcast.dao.impl;
public class PersonDaoBean implements IPersonDao {
/* (non-Javadoc)
* @see cn.itcast.dao.impl.IPersonDao#add()
*/
public void add(){
System.out.println("执行PersonDaoBean类中的add方法");
}
}
cn.itcast.service包下的java文件
package cn.itcast.service;
public interface IPersonService {
public abstract void save();
}
cn.itcast.service.impl包下的java文件
package cn.itcast.service.impl;
import cn.itcast.dao.impl.IPersonDao;
import cn.itcast.service.IPersonService;
public class PersonServiceBean implements IPersonService {
/* (non-Javadoc)
* @see cn.itcast.service.impl.IPersonService#save()
*/
//此方法在配置文件bean标签中用init-method属性调用
private IPersonDao ipersondao ;
public IPersonDao getIpersondao() {
return ipersondao;
}
public void setIpersondao(IPersonDao ipersondao) {
this.ipersondao = ipersondao;
}
public void init(){
System.out.println("初始化");
}
public PersonServiceBean(){
System.out.println("我被实例化了");
}
public void save(){
System.out.println("这是PersonServiceBean类中的save方法");
ipersondao.add();
}
public void destroy(){
System.out.println("关闭打开的资源");
}
}
最后,单元测试用例:
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.service.IPersonService;
public class SpringTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void instanceSpring(){
ApplicationContext ctx1 = new ClassPathXmlApplicationContext("beans.xml");
IPersonService personservice5 = (IPersonService)ctx1.getBean("personservice5");
personservice5.save();
}
}
学习感想:
打个比方:接口IPersonDao是父亲,类PersonDaoBean是接口的儿子。
父亲年龄大了,儿子要尽孝道。现在情况是,父亲有张银行卡add(),但是没钱。儿子有张银行卡add(),有很多钱。
正常情况下是父亲没钱用,儿子主动打钱。好,现在出问题了,儿子不给老子钱了,那怎么办?
找法院判决吧,判决的结果是:儿子的卡和父亲的卡绑定,父亲要用钱直接用自己的卡取,不管(而且自己的卡是没钱的,只是儿子的有钱),儿子由于父亲不怎么会取钱的手续,一切手续由代办机构代办。父亲只管问要钱,想啥时候要就啥时候要,其他一切不必操心。
程序实现以上比喻是这样的:
1:父亲有卡,IPersonDao接口中add方法(方法没实现,比喻为没钱),儿子有卡,PersonDaoBean类中的方法(方法实现,比喻为有钱)
2:儿子的卡与父亲的卡绑定,就是配置文件的依赖注入
<property name="ipersondao" ref="persondao"></property>
3:代理机构帮父亲办理手续取钱,就是spring帮忙管理对象的创建和销毁。
4:父亲取到的钱
测试类中personservice5.save();,能输出儿子(PersonDaoBean)中的add方法中的语句