文章目录
IOC和DI
IOC:反转控制
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率
反转控制的思想完全颠覆了应用程序组件获取资源的传统反射光hi:反转了资源的获取方向,改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器时如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成功,提供了开发的效率。这种行为也成为查找的被动形式。
DI:依赖注入
IOC的另一种表达方式是:即组件以一些预先定义好的方式(比如setter方法)接收来自于容器的资源注入。相对于IOC而言,这种表达更加直接。
IOC描述的是一种思想,而DI是对IOC思想的具体实现
IOC容器在Spring中的实现
1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化
2)Spring提供IOC容器的两种实现方式
-
BeanFactory:IOC容器的基本实现,是spring内部的基础设置,是面向Spring本身的,不是提供给开发人员使用的。
-
ApplicationContext:BeanFactory的子接口,提供了更多的高级特性。面向Spring1的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory
ApplicationContext的主要实现类:
1)ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件
2)FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件
3)在初始化时就创建单例的Bean,也可以通过配置的方式指定创建的Bean是多实例的。
ConfigurableApplicationContext是ApplicationContext的子接口,包括一些扩展方法。
1)refresh()和close()让ApplicationConetext具有启动、关闭和刷新上下文的能力 -
WebApplicationContext:专门为WEB应用而准备的,它允许相对于WEB根目录的路径中完成初始化。
获取Bean的三种方法
1)通过id获取bean
2)通过类型获取bean
但是如果同一个类型的bean在xml文件中配置了多个,则获取时会抛出异常,所以同一个类型的bean在容器中必须时唯一的
- 可以同时指定bean的id值和类型
给Bean的属性赋值
依赖注入的方式
通过bean的setXX()方法赋值
必须提供一个无参构造函数和相应setxxx方法
通过bean的构造器赋值
- Spring自动匹配合适的构造器
通过索引值指定参数位置
2)通过类型区分重载的构造器
备注:当使用有参构造器创建对象时,就不会再调用setXXX()方法给属性赋值了
p命名空间
为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过元素属性的方式配置Bean 的属性。
使用p命名空间后,基于XML的配置方式将进一步简化。
1、引入p命名空间
底层还是调用set和无参构造函数
可以使用的值
字面量
1)可以使用字符串表示的值,可以通过value属性或value子节点的方式指定
2)基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
3)若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来
外部已声明的bean
内部bean
当bean实例仅仅给一个特定的属性使用时,可以将其声明为内部bean。内部bean声明直接包含在< property>或< constructor-arg >元素里,不需要设置任何id或name属性
内部bean不能使用在任何其他地方
给级联属性赋值&&NULL赋值
集合属性
在Spring中可以通过一组内置的XML标签来配置集合属性,例如:,或
数组和List
配置java.util.List类型的属性,需要指定标签,在标签里包含一些元素。这些标签 可以通过指定简单的常量值,通过指定对其他Bean的引用。通过 指定内置bean定义。通过指定空元素。甚至可以内嵌其他集合。
数组的定义和List一样,都使用元素。
配置java.util.Set需要使用标签,定义的方法与List一样。
Map
Java.util.Map通过
集合类型的bean
如果只能将集合对象配置在某个bean内部,则这个集合的配置将不能重用。可以将集合bean的配置拿到外面,共其他bean引用。
1)引入util命名空间
FactoryBean
FactoryBean
Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂bean,即FactoryBean
工厂bean和普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。
工厂bean必须实现org.springframework.beans.factory.FactoryBean接口。
使用:
bean的高级配置
配置信息的继承
1、背景
查看下面两个Employee的配置,其中dept属性是重复的
2.配置信息的继承
spring允许继承bean的配置,被继承的bean称为父bean。继承这个父bean的bean称为子bean
子bean从父bean中继承配置,包括bean的属性配置
子bean也可以覆盖从父bean继承过来的配置
3.补充说明
-
父bean可以作为配置模板,也可以作为bean实例。若只想把父bean作为模板,可以设置< bean>的abstract 属性为true,这样Spring将不会实例化这个bean
-
如果一个bean的class属性没有指定,则必须是抽象bean
-
并不是< bean>元素里的所有属性都会被继承。比如:autowire,abstract等。
也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置。 但 此时abstract必须设为true。
bean之间的依赖
有的时候创建一个bean的时候需要保证另外一个bean也被创建,这时我们称前面的bean对后面的bean有依赖。例如:要求创建Employee对象的时候必须创建Department。 这里需要注意的是依赖关系不等于引用关系,Employee即使依赖Department也可以不引用它。