为什么会存在依赖注入:任何一个有实际意义的应用都会由两个或者更多的类组成,这些类互相之间进行协作来完成特定的业务逻辑。因此存在每个对象负管理与自己相互协作的对象的引用。同时也就会存在个高度耦合的代码。
耦合具有两面性:一方面,紧密耦合的代码难以测试、难以复用、难以理解,兵并且典型地表现出“打地鼠”的bug
另一方面:一定程度的耦合性又是必须的,完全没有耦合的代码什么也做不了。为了完成实际的意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,一次必须被小心管理
依赖注入(dependency infection):通过DI对象的依赖关系将由系统中负责协调个对象的 第三方组件再创建对象的时候进行设定。对象无需自行 创建或管理它们的依赖关系。依赖关系将被自动注入到需要他们的对象当中去。
采用依赖注入最大的好处就是 松耦合,将类之间的耦合行降低了。 简单的说: DI能够让相互协作的组件保持松耦合。
在我们一般使用的类中,一般传入的是接口,例如 类A 中 使用 B类,我们我们传入B类的实现类C(接口),有可能 D类也实现了C类。。这里A类 并没有 与C(接口)的实现发生耦合。。这就是 di带来最大的收益--松耦合。
如果一个对象只通过接口(而不是具体的实现)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
那么问题来了:如果一个接口被多个类实现呢, 怎么把特定的C(接口)实现类传给它呢?
这种创建应用组件之间协作的行为通常称为装配。。spring有多种装配bean的方式,采用的是很常见xml方式
通过spring提供的应用上下文装载bean的定义并把他们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间主要的区别仅仅在于如何加载配置。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Meta-INFO/spring/kinghts.xml");