一: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>zhangsan</value>
<value>zhangsan</value>
<value>zhangsan</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.容器寻找Bean的定义信息并且将其实例化。
2.受用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。
3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5.如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()方法将被调用。
6.如果Bean指定了init-method方法,它将被调用。
7.最后,如果有BeanPsotProcessor和Bean关联,那么它们的postProcessAfterInitialization()方法将被调用。
到这个时候,Bean已经可以被应用系统使用了,并且将被保留在Bean Factory中知道它不再需要。
有两种方法可以把它从Bean Factory中删除掉。
1.如果Bean实现了DisposableBean接口,destory()方法被调用。
2.如果指定了订制的销毁方法,就调用这个方法。
Bean在Spring应用上下文的生命周期与在Bean工厂中的生命周期只有一点不同,
唯一不同的是,如果Bean实现了ApplicationContextAwre接口,setApplicationContext()方法被调用。
只有singleton行为的bean接受容器管理生命周期。
non-singleton行为的bean,Spring容器仅仅是new的替代,容器只负责创建。
对于singleton bean,Spring容器知道bean何时实例化结束,何时销毁,
Spring可以管理实例化结束之后,和销毁之前的行为,管理bean的生命周期行为主要未如下两个时机:
Bean全部依赖注入之后
Bean即将销毁之前
1)依赖关系注入后的行为实现:
有两种方法:A.编写init方法 B.实现InitializingBean接口
afterPropertiesSet和init同时出现,前者先于后者执行,使用init方法,需要对配置文件加入init-method属性
2)bean销毁之前的行为
有两种方法:A.编写close方法 B.实现DisposableBean接口
destroy和close同时出现,前者先于后者执行,使用close方法,需要对配置文件加入destroy-method属性
2. bean的范围
Bean:默认情况下,容器是按照单例的方式去创建的bean,如果不想使用那么用(scope=" ")定义bean的使用范围
Bean的范围有(经常使用的是前两种):
(1)Singleton:默认的
(2)Prototype:每次取出的都是新的对象
(3)Request:bean的生命周期和一个http请求一直
(4)session:在一个会话周期中有效
六:IOC中其他接口的使用
1. Beanpostprocessor:(后处理bean)在对象实例化后,进行方法调用前进行特殊处理
2. BeanFactoryPostProcessor:在实例化对象前,对配置文件进行特殊处理
3. PropertyeditorSupport :属性编辑器类
可以根据定义的规则,将字符串类型自动编辑成一个对象类型来进行属性注入。
4. PropertyPlaceholderConfigurer:
方便分散配置的一个类,可以读取配置文件,以${key}获得对应的value值
5. CustomEditorConfigurer:配置用户自定义的属性编辑器
例:
<bean
class="org.springframework.beans.factory.config
.PropertyPlaceholderConfigurer">
<property name="location">
<value>ioc//info.properties</value>
</property>
</bean>
<bean id="customEditorConfigurer"
class="org.springframework.beans.factory.config
.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="ioc9.Address">
<bean id="myEditor"class="ioc9.AddressEditor">
</bean>
</entry>
</map>
</property>
</bean>
七:Spring的事件处理机制:(监听机制)
1. 自定义一个事件,需要实现接口ApplicationEvent
2. 定义一个监听器,需要实现接口ApplicationListener
3. bean调用容器的方法,发布事件,需要实接口ApplicationContextAware,来获得对容器的引用