spring中的ioc

来源:互联网 发布:淘宝最常见韩国模特 编辑:程序博客网 时间:2024/05/18 17:58

原文:http://hi.baidu.com/zhong8880/blog/item/6d486b4efc3b8203b3de05ee.html

 

一:IoC简介:
1:概念定义:
类之间的依赖关系,不再由类自己去负责,而是由容器根据配置文件去创建实例并维护各个实例之间的依赖关系。
2:优点
(1):避免了代码的纠缠,(业务逻辑和业务逻辑无关的代码纠缠到一块)代码更容易被维护
(2):模块的耦合性降低
(3):易测试:
二:Spring中实现IoC的方式:依赖注入(Dependency Injection)
1:Spring中依赖注入的两种方式:
(1):通过setter方法注入:
<property name=””  ></property>
其中,name属性的取值依setter方法名而定,要求这个类里面这个对应的属性必须有setter方法
(2):通过构造方法注入:
<constructor-arg index=””></ constructor-arg>
其中,index表示构造方法中的参数索引(第一个参数索引为0)
要求这个类里面必须有想对应的构造方法
2:二者使用区别:
constructor: 可以在构建对象的同时,把依赖关系也构建好。对象创建好就准备好的所有的资源。安全性高。
Setter: 建立的对象关系(参数)很多。创建完对象之后再同过set()方法进行设定。
Spring 鼓励使用setter的方式注入。

三:容器对bean属性的装配
1:基本类型和字符串类型属性的装配(value):
<property name="owner">
<value>许峥</value>
</property>
2:引用类型属性的装配
<property>
<ref bean="otherBean" />
</property>
(1)ref: local 只在当前配置文件中找
(2)ref:bean 在所有的配置文件中
(3)直接把另外一个bean的定义,定义在一个bean里面。
相当于定义了个内部类,但是客户端就不可见内部定义的bean
3:集合类型属性的装配
(1):list:
集合里面可以混合存放各种类型,支持泛型,存放的数据是有序的,可以有重复,
(2):set:
可以混合存放各种类型
支持泛型
存放的数据是无序的,不可以重复
(3):map
支持泛型
存放键值对。
(4):props:
本质上也是一个map,但是键值都是字符串类型的。
例子:
<property name="listProperty">
<list>
<value>xuzheng</value>
<value>xuzheng</value>
<value>xuzheng3</value>
</list>
</property>
<property name="setProperty">
<set>
<value>str</value>
<value>str</value>
<value>str1</value>
</set>
</property>
<property name="mapProperty">
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
</map>
</property>
<property name="proProperty">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>

四:bean 的其他属性介绍
1:自动装配 (bean标签的autowire属性):
作用:不明确配置,自动将某个bean 注入到另一个bean的属性当中
分类:
(1)byname:通过id 的名字来进行匹配,
(2)byType:通过类型来进行匹配
(3)constructor: 根据java 源程序中定义的构造方法,再根据类型进行匹配。
(4)autodetect:完全交给spring管理, spring 则再根据constructor byType的顺序进行匹配。
注:
自动装配的优先级低于手动装配
自动装配一般应用于快速开发中,但是不推荐使用,代码简单,但是
一方面容易出错,另一方面也不方便后期的维护
五:bean实例的生命周期及范围
1:Bean的生命周期:
(1):实例化(必须的)构造函数构造对象
(2):装配(可选的)为属性赋值
(3):回调(可选的)(容器-控制类和组件-回调类)
(4):初始化(init-method=””)
(5):就绪
(6):销毁(destroy-method=””)
2:bean 的范围
Bean:默认情况下,容器是按照单例的方式去创建的bean,
如果不想使用那么用(scope=“”)定义bean的使用范围
Bean的范围有(经常使用的是前两种):
(1):Singleton:默认的
(2):Prototype:每次取出的都是新的对象
(3):Request:bean的生命周期和一个http请求一直
(4):session:在一个会话周期中有效
(5):global-session:

六:aop中其他接口的使用
1:Beanpostprocessor:(后处理bean)在对象实例化后,进行方法调用前进行特殊处理
2:BeanFactoryPostProcessor:在实例化对象前,对配置文件进行特殊处理
3:PropertyeditorSupport: 属性编辑器类
可以根据定义的规则,将字符串类型自动编辑成一个对象类型来进行属性注入。
4:PropertyPlaceholderConfigurer:
方便分散配置的一个类,可以读取配置文件,以${key}获得对应的value值
5:CustomEditorConfigurer:配置用户自定义的属性编辑器
使用例子(3,4,5):
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>ioc9//info.properties</value>
</property>
</bean>
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="ioc9.Address">
<beanid="myEditor"class="ioc9.AddressEditor">
</bean>
</entry>
</map>
</property>
</bean>
七:Spring的事件处理机制:(监听机制)
1:自定义一个事件,需要实现接口ApplicationEvent
2:定义一个监听器,需要实现接口ApplicationListener
3:bean调用容器的方法,发布事件,
需要实接口ApplicationContextAware,来获得对容器的引用