Spring框架系列----IOC基础(跟我学Spring系列了解)
IOC: Inversion Of Control ;控制反转,容器帮忙创建及注入依赖对象
传统情况: 程序主动创建相关对象然后组合起来
通俗点说:以前用户类都是new出来的,经常实例化
反转: 容器帮忙创建以及注入依赖对象
;
只用new一次即可
传统程序,都是在类内部主动创建依赖对象,而IOC则把创建和查找依赖对象的控制权都交给了容器,由容器进行注入组合对象,所以对象与对象之间松散耦合.
IOC负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖,应用程序不用new相关的对象,应用程序由IOC容器进行组装,Spring的BeanFactory就是IOC容器的实际代表者
Spring IOC 容器如何知道哪些是它管理的对象?
配置文件: Spring IOC 通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配,一般都是xml形式的的配置文件
Bean的概念
由IOC容器管理的那些组成应用程序的对象就叫Bean,Bean是Spring容器初始化,装配及管理的对象,除此之外,bean就与应用程序的其他对象没有区别了
IOC源码解析
org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IOC最基本功能,org.springframework.context接口扩展了BeanFactory,ApplicationContext继承BeanFactory,因而BeanFactory所有语义也适用于ApplicationContext
xmlBeanFactory:BeanFactory实现,目的是获取配置文件,实现不同的bean
1.File file=new File("fileSystemConfig.xml")
Resource resource=new FileSystemResource(file);
BeanFactory bean Factory=new XmlBeanFactory(resource);
2.Resource resource=new ClassPathResource("classpath.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
ApplicationContext实现:
ClassPathXmlApplicationContext:从classpath处获取
BeanFactory beanFactory=new ClassPathXmlApplicationContext("classPath.xml");
FilSystemXmlApplicationContext: 从文件系统里获取
BeanFactory beanFactory= new FileSystemXmlApplicationContext("fileSystem.xml");
ApplicationContext获取bean的方法:
a. Object getBean(String name) 根据名称返回一个Bean
b.T getBean(String name,Class<T> requiredType)根据名称和指定的类型返回一个bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常
c. T getBean(Class<T> requiredType)根据指定类型返回一个Bean,客户端无需自己进行转换,如果没有或有多个Bean存在将抛出异常
d.Map<String,T>getBeansOfType(class<T>type)根据指定的类型返回一个键值为名字和值为Bean对象的Map,如果没有Bean对象存在则返回空的map
IOC容器工作原理:
1.准备配置文件:在配置文件中声明Bean定义,即为Bean配置元数据
2.由IOC容器进行解析元数据:IOC容器的Bean reader 读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IOC容器根据BeanDefinition进行实例化,配置以及组装Bean.
3.实例化IOC容器:由客户端实例化容器,获取需要的Bean.
Bean的配置与命名
Spring IOC容器目的就是管理Bean ,Bean的定义根据配置文件中Bean的定义创建,而Bean定义在容器内部由BeanDefinition对象表示:
1.全限定类名:用于定义Bean的实现类
2.Bean行为定义:定义了Bean在容器中的行为:作用域,是否惰性初始化及生命周期
3.Bean创建方式定义;通过构造器还是工厂方法创建Bean
4.Bean之间关系定义:即对其他bean的引用,即依赖关系定义,也就是依赖注入
Bean的命名:
每个Bean可以有一个或者多个id,第一个id为标识符,其余称为别名,容器内这些id必须是唯一的
实例化Bean
1使用构造器实例化Bean
a.使用空构造器进行定义,使用此方式,class属性指定的类必须有空构造器
<bean name="bean1" class="cos.con.spring.bean.create"/ >
b.使用有参数的构造器定义
<bean name="bean1" class="cos.con.spring.bean.create" >
<!--指定构造器参数 index为位置,value为常量值或者引用---->
<constructor-arg index="0" value="Hello Spring!">
<bean/>
2.使用静态工厂方式实例化Bean,除了指定的class属性,还要指定factory-method属性指定实例化bean的方法
3.使用实例化工厂方法实例化Bean