控制反转(IOC)和依赖注入(DI)实际上就是两个相辅相成的东西,控制反转说的是控制权由组件转移到了容器,依赖注入就是说组件以一些预先定义的方式接受来自容器的资源。
IOC:
1. (前生)分离接口与实现:
需求:生成HTML或PDF格式的不同类型的报表
2. (前生)工厂设置模式
3. 采用反转控制
配置Beans
Class: bean的全类名,通过反射的方式在IOC容器中创建bean,所以要求bean中必须有无参构造器,而java默认存在无参构造器;而当我们需要增加有参构造器时,也需要把无参构造器写出。
Id: 标识容器的bean.id是唯一的,不可重复。
两种IOC容器的实现:
BeanFactory:IOC容器的基本实现。
ApplicationContext: 提供更多的高级特性,是BeanFactory的一个子接口。
BeanFactory是spring框架的基础设施,面向spring本身;
而ApplicationContext面向使用spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而不是BeanFactory。
ApplicationContext主要实现类:
ClassPathXmlApplicationContext :从类路径下加载配置文件
FileSystemXmlApplicationContext : 从文件系统中加载配置文件
ConfigurableApplicationContext :扩展于 ApplicationContext,新增了两个主要方法:refresh()和close(), 让ApplicationContext具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例了所有单例的Bean
WebApplication是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。
字面值:可用字符串表示的值,可以通过<value>元素标签或者value属性进行注入;
基本数据类型及其封装类、string等类型都可以采取字面值注入的形式
若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包起来
无论使用何种方式,配置文件时都是相同的。(也就是xml配置方式都是一样的)
可以通过spring内置的xml标签(例如<list>,<set>,<map>)来配置集合属性。
配置java.util.List类型的属性,需要通过<list>标签,在标签里包含一些元素,这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其他bean的引用,通过<bean>指定内置Bean定义,通过<null /> 指定空元素,甚至可以内嵌其他集合。
数组的定义和List一样,都使用<list>
配置<java.util.Set>需要使用<set>标签,方法和<list>一样。
Java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签,每个条目包含一个键和一个值。
必须在<key>标签中定义键,
因为键和值的类型没有限制,所以可以自由的为它们指定<value> 、<ref> 、<bean>
、<null>元素
可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义,bean使用key-ref和value-ref属性进行定义
使用<props>定义java.utilProperties,该标签使用多个<prop>作为子标签,每个都需要定义<key>属性。