Spring IoC容器小结

本人学习的基本方式: 首先理解基本概念(是什么)、其次编写示例(怎么做)、最后理解原理(为什么这么做),当然以上完成后,还可以了解其源代码及设计模式。

基本概念:

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

●谁依赖于谁:当然是应用程序依赖于IoC容器;

●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),

所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

注:如果想要更加深入的了解IoC和DI,请参考大师级人物Martin Fowler的一篇经典文章《Inversion of Control Containers and the Dependency Injection pattern》,

原文地址:http://www.martinfowler.com/articles/injection.html。


理解IoC容器问题关键:控制的哪些方面被反转了?

1、谁控制谁?为什么叫反转? IoC容器控制,而以前是应用程序控制,所以叫反转

2、控制什么? 控制应用程序所需要的资源(对象、文件……)

3、为什么控制? 解耦组件之间的关系

4、控制的哪些方面被反转了? 程序的控制权发生了反转:从应用程序转移到了IoC容器。


IoC容器特点:

【1】无需主动new对象;而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化;

【2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;

【3】主动变被动,好莱坞法则:别打电话给我们,我们会打给你;

【4】迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向接口编程),松散耦合,

一个对象应当对其他对象有尽可能少的了解,不和陌生人(实现)说话。

  【5】IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。


Spring IoC 实现方式:

1. 构造器注入

    构造器注入有以下几种实现方式: 

        a) 根据参数索引注入,使用标签“<constructor-arg index="1" value="1"/>”来指定注入的依赖, 其中“index”表示索引,从0开始,即第一个参数索引为0,“value”来指定注入的常量值。

       b) 根据参数类型进行注入,使用标签“<constructor-arg type="java.lang.String" value="Hello World!"/>”来指定注入的依赖,其中“type”表示需要匹配的参数类型,可以是基本类型也可以是其他类型,如“int”、“java.lang.String”,“value”来指定注入的常量值。

       c) 根据参数名进行注入,使用标签“<constructor-arg name="message" value="Hello World!"/>”来指定注入的依赖,其中“name”表示需要匹配的参数名字,“value”来指定注入的常量值。


2. setter注入

   setter注入,是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖

   Spring如何知道setter方法?

   其实方法名是要遵守约定的,

   setter注入的方法名要遵循“JavaBean getter/setter 方法命名约定”:

   JavaBean:是本质就是一个POJO类,但具有一下限制:

            该类必须要有公共的无参构造器,如public HelloImpl4() {};

属性为private访问级别,不建议public,如private String message;
属性必要时通过一组setter(修改器)和getter(访问器)方法来访问;

setter方法,以“set” 开头,后跟首字母大写的属性名,如“setMesssage”,简单属性一般只有一个方法参数,方法返回值通常为“void”;

getter方法,一般属性以“get”开头,对于boolean类型一般以“is”开头,后跟首字母大写的属性名,如“getMesssage”,“isOk”;

还有一些其他特殊情况,比如属性有连续两个大写字母开头,如“URL”,则setter/getter方法为:“setURL”和“getURL”,

  其他一些特殊情况请参看“Java Bean”命名规范。


    以上两种比较常用,还有两种,一个是通过工厂静态方法和工厂实例方法来完成注入,有兴趣可以了解一下。

以上转自【http://sishuok.com/forum/blogPost/list/2427.html】







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值