先看下图:
传统方式就是主动创建;例如你看到一种果汁的描述如下:
public class MakeOrange { private String water; private String sugar; private String orange;
你看到了描述后想要喝这种果汁,然后你主动的找到了一个生产机器,然后你把它拿l过来,
public class Orange { private MakeOrange ora; public MakeOrange getOra() { return ora; } public void setOra(MakeOrange ora) { this.ora = ora; } public String Oranger(){ String drinks="这是一杯由"+ora.getWater()+","+ora.getSugar()+","+ora.getOrange()+",构成的饮料!"; return drinks; } }
然后你就开始造果汁了:
public String makedrinks(){ Orange ora=new Orange(); return ora.Oranger(); }
你为了喝个果汁,你还要自己去创造个方法区生产,这是不是太麻烦;那我们为什么不找个第三方的人直接给我们果汁呢,
<bean id="makeorange" class="pojo.MakeOrange"> <property name="water" value="水"></property> <property name="sugar" value="糖"></property> <property name="orange" value="橙汁"></property> </bean> <bean id="orange" class="pojo.Orange"> <property name="ora" ref="makeorange"></property> </bean>
BeanFactory ctx = new ClassPathXmlApplicationContext("spring.xml"); Orange bean = (Orange) ctx.getBean("orange"); String oranger = bean.Oranger();
这就是被动创建,第三方把我们想要的传递给工厂然后工厂给我们创建了我们的果汁,他怎么创建的,你是没有参与其中的,与你无关,你只是说了你想要的,然后人家给你了;这里的第三方就是Spring容器。
在这个过程中:
1)工厂依赖了你提供的果汁描述,就是她生产你想要的果汁就必须依靠你提供的资源,然后依靠容器把它需要的资源注入进去,这就是依赖注入;
2)控制反转就是从容器角度看这个过程,工厂需要你的资源,然后容器就把你的资源给它了;控制权已经不在你的手里了。