Spring框架入门01-理解Spring的DI

PS:很少写博~看了一篇文章受了刺激~决定也写写博客~文笔很次大家喜欢看就看,不喜欢也别拍砖~

很久很久以前~~
在美丽的城堡里面住着一位漂亮的公主,他和他的家人、朋友幸福的生活着;
有一天邪恶的格格巫来到了这个城堡,他看见了漂亮的公主于是她决定要将公主抢走~
格格巫使用了一个邪恶的魔法将公主抓了起来,公主很害怕、国王很着急~
这是来了一个真正的勇士他的名字叫做小灰灰~~~
小灰灰伟大的英雄~他经历的千难万险拯救了公主~
公主深深的爱上了小灰灰~从此他们幸福的在一起白头偕老~
这是一段美丽的故事,指头人们决定将这段感人的历史记录下来

/**
 * 伟大的英雄
 */
public class Hero {
	private String name;
	private RescueQuest quest;
	public Hero(String name) {
		this.name=name;
		quest=new RescueQuest();
	}
	public Princess embarkOnQuest() throws PrincessNotFoundException{
		return quest.embark();
	}
}
/**
 * 艰难的拯救任务
 */
public class RescueQuest {
	public Princess princess;

	public Princess embark() throws PrincessNotFoundException {
		princess = null;
		// Our Hero do a Hard job to look for pretty princess
		System.out.println("Our Hero do a hard job to look for the pretty princess");
		// .......
		return princess;
	}
}
/**
 * 美丽的公主
 */
public class Princess {
	public void KissHero(){
		System.out.println("Princess give him a SweetKiss!");
	}
}

于是指头人开始尝试演绎这段历史~

/**
 * 指头人们尝试演绎这段历史
 */
public class StoryTest extends TestCase{
	public StoryTest(String testName) {
		super(testName);
	}
	public static Test getTestSuit(){
		return new TestSuite(StoryTest.class);
	}
	
	public void testStory() throws PrincessNotFoundException{
		Hero hero = new Hero("小灰灰");
		Princess princess = hero.embarkOnQuest();
		assertNotNull(princess);
	}
}

在公开表演之前他们信心十足~但细心的指头人们还是决定进行一次彩排~
可怕的事情发生了~
**他们的英雄需要一个拯救任务!他们测试英雄的描述就等于间接的测试了一个拯救任务,而拯救任务又关联了一场异常....
**这样他们根本没有办法可控的验证英雄的形象是否可靠~
聪明的指头人发现了问题的关键~Hero怎么获得RescueQuest的?
不管Hero是实例化了一个RescueQuest还是从JNDI查找了一个Quest,Hero都要负责去获得一个任务。
但是给英雄设置障碍应该是可恶的格格巫的工作啊~
问题出现了我们的Hero依赖Quest
**************指头人的回忆录**************
在业务处理过程中常常需要多个对象相互关联才能进行。
这种耦合是一个双头怪:
他常常给我们带来问题,但是没有耦合我们却什么都不能做。
这种耦合有时候叫做依赖~
通常解决耦合的方法就是讲具体的实现类隐藏在接口之下
这样替换具体的实现类就不会影响引用类
**************************************
于是乎指头人从新修改了他们的描述
他们创建一个抽象的接口代表RescueQuest

public interface Quest {
	Object embark() throws QuestFaildException;
}

并且修改了其它的类以适应这次修改,对于指头人这是一次痛苦的经历
但是问题并没有好转,因为即使是这样小灰灰还是只能进行拯救公主的冒险
**************指头人的回忆录**************
问题是该样小灰灰自己去获取一个任务
还是应该由格格巫给他一个任务
这是问题的关键
**************************************
指头人修改了Hero让他可以被给予一个任务而不是自己去获取一个任务
他们给他添加了一个Setter

public class Hero {
	private String name;
	private Quest quest;
	public Hero(String name) {
		this.name=name;
	}
	public Object embarkOnQuest() throws QuestFaildException{
		return quest.embark();
	}
	public void setQuest(RescueQuest quest) {
		this.quest = quest;
	}
}

好了现在小灰灰可以接受挑战啦~~~
我们来看看格格巫是怎么给小灰灰赋予一个挑战的~
<?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-3.1.xsd">
	<!--这里格格巫就定义了一个挑战-->
	<bean id="quest" class="fd2.springlearn.di.entity.RescueQuest"></bean>
		
</beans>

/**
 * 指头人们尝试演绎这段历史
 */
public class StoryTest extends TestCase{
	public StoryTest(String testName) {
		super(testName);
	}
	public static Test getTestSuit(){
		return new TestSuite(StoryTest.class);
	}
	
//	public void testStory() throws QuestFaildException{
//		Hero hero = new Hero("小灰灰");
//		Princess princess = (Princess) hero.embarkOnQuest();
//		assertNotNull(princess);
//	}
	public void testStory2() throws QuestFaildException{
		Hero hero = new Hero("小灰灰");
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("src/main/resources/applicationContext.xml"));
		Quest quest = (Quest) factory.getBean("quest");
		hero.setQuest(quest);
		Princess princess = (Princess) hero.embarkOnQuest();
		assertNotNull(princess);
	}
}
好吧~
我承认我的故事讲得很烂~很烂~
第一篇希望大家能见谅~


总结一下:

1.我们离不开代码的耦合,可以理解成耦合就是一种依赖

2.解耦合常用的一种方式使用接口隐藏实现类,这样实现类的改变就不会影响引用类


3.啥事依赖说完了,用硬编码方式写依赖的缺陷希望大家能体会。DI叫做依赖注入,至于怎么注入下次再说啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值