概述
IOC(控制反转) 是一种很设计思想,目的是为了指导我们设计出松耦合的程序
- 控制 : 指的是对象的控制权,在java中可以理解为对象的控制权限(对象的创建,销毁等)
- 反转 : 指的是对象的控制权由原来在程序员手中交给spring容器去管理
- 总结来说 : 就是对象的控制权交给spring容器,由spring容器来管理对象的生命周期和对象之间的关系,程序员需要获取对象时去spring容器中获取
- 主要功能是 : 降低了对象之间耦合度高,实现对象之间的解耦
- IOC底层用的原理是 : 反射
我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用java的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
BeanFactory和ApplicationContext
BeanFactory
- BeanFactory是IOC的心脏,
- 是 IOC 容器的核心接口,它定义了IOC的基本功能。
- 加载bean的配置,管理bean的生命周期,维护各个bean之间的关系
ApplicationContext
- ApplicationContext是BeanFactory的子接口,可以比喻为spring的躯体
- ApplicationContext在Beanfactory的基础上填加了新的功能:
- 支持aop和web应用
- MessageSource,提高国家化的消息访问
- 通过配置来实现BeanFactory中很多编码才能实现的功能
- ApplicationContext常用的API
- ClassPathXmlApplicationContext : 从classpath目录中读取文件
- FileSystemXmlApplicationContext : 从文件系统或者url中读取文件
- AnnotationConfigApplicationContext : 当我们使用注解配置容器时,需要使用此类来创建spring容器,他来读取注解
- 两者的区别:
面向群体
- BeanFactory :是面向spring框架的基础设施,也就是供spring内部使用的
- ApplicationContext:是面向spring框架的使用者
创建bean的时间
- BeanFactory常见容器时并没有加载bean,只有使用者调用了getBean()方法时才会创建bean
- ApplicationContext是加载容器启动时就会一次性加载所有的bean对象(优点就是让容器启动时就可以看出bean中的配置是否有报错,缺点技术加载的bean过多的话,会占用内存空间,减低效率)
生命周期
<!--
定义配置信息
id:唯一标志(获取的时候,调用容器的getBean("id"))
class:实现类的全限定类名
scope:对象作用域
singleton : 单例(默认)
prototype :多例
request
session
global-session
原理:
通过反射调用,无参构造方法创建对象
-->
<bean id="userDao" class="cn.itcast.dao.impl.UserDaoImpl" scope="prototype" </bean>
singleton 单例模式 : 由容器控制生命周期,容器创建则对象创建,容器销毁则对象销毁
prototype 多例模式 : 调用getBean()方法时创建对象.spring无法销毁,由javacg(垃圾处理机制)负责销毁
DI 依赖注入
概述:
是spring框架核心IOC的具体实现,通过控制反转将对象的创建交给了容器,但是代码中不可能出现没有依赖的情况
IOC具有两个功能 : 依赖注入和依赖查找
本质 : 为对象中的私有属性赋值
形式:
- set方式
-有参构造方法