什么是IOC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
IOC: Inversion of Control(控制反转)。
控制反转:将对象的创建权反转给(交给)Spring。
Spring IOC的实践
核心部分红框就是springIOC的内容,包括bean,core,context工厂的内容
原本我们面向接口编程能更好的扩展程序,但是接口和实现类联系太紧密,想把dao的实现类换成别的实现类便要把程序里面的UserDaoImpl都要改成别的,若使用这个实现类越多,修改的源代码就越多,好的程序设计遵循OCP原则,尽量少改动源代码,通过工厂设计模式的实现,现在要修改实现类只需要对配置文件做出修改就好,其中bean标签的工作原理如红色代码所示,所以以后修改UserDaoImpl只需要在配置文件修改就好。
IOC和DI
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。就是spring在帮我们创建这个类的实例当中,发现这个类中有一个属性,帮我们把这个属性设置进来。
如
String就是这个类,name就是这个属性
面向对象的时候
依赖
Class A{
}
Class B{
public void xxx(A a){
}
}
继承:is a
Class A{
}
Class B extends A{
}
聚合:has a
有许多的对象,缺某一个也不会影响。
Spring的工厂类
Spring的工厂类
Spring工厂类的结构图
1.4.1.2 BeanFactory :老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。就是下图getBean
ApplicationContext :新版本的工厂类
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。new的时候已经将它实例化
ApplicationContext有两个实现类
ClassPathXmlApplicationContext :加载类路径下的配置文件(一般就放在工程下面)
FileSystemXmlApplicationContext :加载文件系统下的配置文件,就是你放在本机磁盘哪里
老版本的工厂类与新版本的用法是一样的。
Spring的配置
XML标签的配置提示
Schema的配置
1.5.2.1 标签的id和name的配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。不然不知道实例的是谁。可以换成name
name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
Spring和Struts1框架整合的时候,就不能使用id了
1.5.2.2 Bean的生命周期的配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
在application.xml配置
Bean的作用范围的配置(重点)
scope :Bean的作用范围:
singleton :默认的,Spring会采用单例模式创建这个对象。你没有做任何配置的情况下。不管有多少个程序调用,只会new一次。
prototype :多例模式。(Struts2和Spring整合一定会用到),用一次就new一个实例。(Struts2和Spring整合一定会用到)
现在dao1跟dao2的对象是不同的,而且也不会被销毁,因为工厂被创建了多个,不知道要销毁哪个
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。就像登陆了qq一样,qq的子应用便不用再次登陆。如果没有这种环境,它的作用就跟session一样。
Spring的属性注入
构造方法的方式的属性注入
Set方法的方式的属性注入
Set方法设置对象类型的属性
P名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入:
写法:
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
P名称空间的引入
SpEL的属性注入(Spring3.0以后)
Spring Expression Language,Spring的表达式语言。
可以直接用特定格式引入别的类的属性
集合类型属性注入
分模块配置
在加载配置文件的时候,加载多个
在一个配置文件中引入多个配置文件