控制反转(IOC):不需要主动去创造,或者不需要自己去取。而是直接告诉我需要什么,然后你给我放进来.
IoC模式,系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码
可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
优缺点编辑
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺陷所在。
配置注意点:
- bean必须要有无参的构造函数
- id必须唯一
- 属性的注入用setter方法注入(不只是spring,一般用反射也是一样)
- 属性有特殊字符的时候可以用 <![CDATA] [特殊字符] >
- 属性如果有引用类型使用 ref="bean的id"
- null的专有标记 <null/>
- 给级联属性赋值:<property name="car.maxSpeed" value="2222"/> 注意:这个car要先被初始化才可以给它的属性赋值
- 也可以用构造器构造:xml里是用<constructor-arg>标签
- 那么如何区别重载的构造方法,在标签里加上type属性
- spring属性可以是List set map集合
- 可以配置properties属性值(properties是Hashtable的子类)
- 集合的bean可以拿出来,可以配置、单例的集合bean。需要导入util的命名空间:
<util:list id="cars">
<ref bean="car">
<ref bean="car2">
</util:list>
- 通过p可以命名空间为bean的属性赋值
<bean id="id1" class="com.xxx.xxx.xxx.object" p:name="aa" p:name2="bb" p:name3="cc">
</bean>
- autowire 可以使用autowire进行自动装配:
byName根据bean的名字和当前bean的setter风格的属性名进行装配,如果没有则不装配
byType是根据bean的类型和当前bean的属性的类型进行装配,如果同时又1个以上能匹配上的则抛异常
如果用了则必须都要用自动装配
其实很少使用。 - parent=“bean的名字” 配置这个属性后可以继承这个bean的属性,也可以覆盖父类的属性 ,也可加个abstract="true"属性编程抽象bean,和抽象类的概念一样,不能被实例化
- 也可以配置让一个bean依赖于一个bean
depends-on="bean名字"
这个前置的bean会在这个bean之前创建好
- 配置好的bean默认都是单例的,可以使用scope="作用域"。
作用域有:singleton单例的,prototype原型的(容器初始化时不会创建bean实例,而是在每次请求时创建一个新的bean实例),request,session对应域对象 - 我们可以使用<context:property-placeholder location="classpath:xxxx.properties">来导入外部的配置文件,然后我们使用${属性名}来使用属性值。这样可以方便我们bean的管理,易于维护。
我们一般用实现ApplicationContet这个接口的实现类,不用BeanFactory(这个BeanFactory是给spring里自己用的)
ApplicactionContext的主要的实现类:
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统下加载配置文件
ConfigurableApplicationContext:对ApplicationContext的扩展,主要是增加了两个方法:refresh,close用来刷新和关闭上下文
WebApplicationContext是专门用来给web应用用的,允许从web的根目录来完成初始化工作