【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 01
来源:互联网 发布:健身理论 知乎 编辑:程序博客网 时间:2024/05/19 02:40
越努力,越幸运
Spring Ioc容器是一个提供IoC支持的轻量级容器。它和IoC Service Provider所提供的服务之间存在一定的交集,如下:
Spring的IoC容器支持以及衍生了许多高级特性。Spring提供了两种容器类型:BeanFactory和ApplicationContextBeanFatory:基础类型IoC容器,提供完整的IoC服务支持。默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管理对象的时候,才对该受管对象进行初始化以及依赖注入操作。ApplicationContext:基于BeanFactory,相对比较高级的容器实现。相比BeanFactory要求更多的系统资源,启动时候较长,但是拥有事件发布、国际化等高级特性。下面是书上的BeanFactory和ApplicationContext关系图:
4.1 拥有BeanFactory之后的生活
“拉拉扯扯的事情”,以前我们的系统业务对象需要自己去“拉“所依赖的业务对象,有了BeanFactory后,需要依赖什么让BeanFactory为我们推过来。介绍了Spring配置XMl文件后,我们就将“生产图纸”交给BeanFactory
BeanFactory container = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); CarFactory carFactory = (CarFactory) container.getBean("carFactory"); carFactory.getCar();
ApplicationContext container = new ClassPathXmlApplicationContext("spring-config.xml"); CarFactory carFactory = (CarFactory) container.getBean("carFactory"); carFactory.getCar();
ApplicationContext container = new FileSystemXmlApplicationContext("spring-config.xml"); CarFactory carFactory = (CarFactory) container.getBean("carFactory"); carFactory.getCar();
都是最基本的配置和操作,就不细讲了
4.2 BeanFatory的对象注册于依赖绑定方式
4.1.2 直接编码方式
public static void main(String[] args) { DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory(); BeanFactory container = bindViaCode(beanRegistry); CarFactory carFactory = (CarFactory) container.getBean("carFactory"); carFactory.getCar(); } private static BeanFactory bindViaCode(BeanDefinitionRegistry registry) { AbstractBeanDefinition carFactory = new RootBeanDefinition(CarFactory.class,1,true); AbstractBeanDefinition sellModel = new RootBeanDefinition(Limousine.class,1,true); AbstractBeanDefinition carAssembly = new RootBeanDefinition(SportCarListener.class,1,true); // 将bean定义注册到容器中 registry.registerBeanDefinition("carFactory",carFactory); registry.registerBeanDefinition("sellModel",sellModel); registry.registerBeanDefinition("carAssemblyListener",carAssembly); // 指定依赖关系 // 1.构造方式注入// ConstructorArgumentValues argValues = new ConstructorArgumentValues();// argValues.addIndexedArgumentValue(0,carAssembly);// argValues.addIndexedArgumentValue(1,sellModel); // 2.Setter方式注入 MutablePropertyValues propertyValues = new MutablePropertyValues(); propertyValues.addPropertyValue(new PropertyValue("carAssemblyListener",carAssembly)); propertyValues.addPropertyValue(new PropertyValue("sellModel",sellModel)); carFactory.setPropertyValues(propertyValues); // 绑定完成 return (BeanFactory) registry; }
这里使用了DefaultListableBeanFactory实现类,继承关系如下:
书上这句话讲解的很清楚:BeanDefinitionRegistry就像图书馆的书架,所有的书是放在书架上的。虽然你还书或者借书都是跟图书馆(也就是BeanFactory,或许BookFactory可能更好些)打交道,但书架才是图书馆存放各类图书的地方。所以,书架相对于图书馆来说,就是它的“BookDefinitionRegistry”
4.2.2 外部配置文件方式
1.Properties配置文件的加载
carFactory.(class)=com.xservice.h3c.spring.chapter03.CarFactory# ----------通过构造方法注入的时候-------------carFactory.$0(ref) = sellModelcarFactory.$1(ref) = carAssembly# ----------通过setter方法注入的时候---------# carFactory.sellModel(ref)=sellModel# carFactory.carAssemblyListener(ref)=carAssemblysellModel.(class)=com.xservice.h3c.spring.chapter03.LimousinecarAssembly.(class)=com.xservice.h3c.spring.chapter03.SportCarListener
public static void main(String[] args) { DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory(); BeanFactory container = bindBiaPropertiesFile(beanRegistry); CarFactory car = (CarFactory) container.getBean("carFactory"); car.getCar(); } private static BeanFactory bindBiaPropertiesFile(DefaultListableBeanFactory beanRegistry) { PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(beanRegistry); reader.loadBeanDefinitions("classpath:spring-config.properties"); return beanRegistry; }
2. XML配置格式的加载
XML配置格式是Spring支持最完整,功能最强大的表达方式Spring2.x之前,XML配置文件采用DTD(Document Type Definition)、2.x之后,引入了基于XSD(XML Schema Definition)的约束方式。不过,原本基于DTD的方式仍然有效。
<bean id="carFactory" class="com.xservice.h3c.spring.chapter03.CarFactory"> <constructor-arg index="0"> <ref bean="sellModel" /> </constructor-arg> <constructor-arg index="1"> <ref bean="carAssemblyListener" /> </constructor-arg> </bean> <bean id="carAssemblyListener" class="com.xservice.h3c.spring.chapter03.SportCarListener"> </bean> <bean id="sellModel" class="com.xservice.h3c.spring.chapter03.Limousine"> </bean>
public static void main(String[] args) { DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory(); BeanFactory container = bindViaXMLFile(beanRegistry); FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("carFactory"); newsProvider.getAndPersistNews(); } public static BeanFactory bindViaXMLFile(BeanDefinitionRegistry registry) { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry); reader.loadBeanDefinitions("classpath:spring-config.xml"); return(BeanFactory)registry; }
4.2.3 注解方式
BeanFactory“几乎”支持IoC Serivce Provider可能使用的所有方式。之说以这么说,有两个原因:
- 在Spring2.5之前,Spring框架并没有正式支持基于注解方式的依赖的注入
- Spring2.5发布的基于注解的依赖注入方式,如果不适用classpath-scanning功能的话,仍然部分依赖于“基于XML配置文件的”的依赖注入方式
<context:component-scan base-package="com.xservice.h3c.spring.chapter03" />
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml"); CarFactory carFactory = (CarFactory) applicationContext.getBean("carFactory"); carFactory.getCar(); }
总结:主要讲了配置文件加载,IoC如何获得对象,基础理论,看完敲完就完了,\(^o^)/~
0 0
- 【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 01
- 【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 02
- 《Spring揭秘》第四章 读书笔记 —— Spring的IoC容器之BeanFactory
- Spring揭秘(四)——Spring的IOC容器之BeanFactory
- Spring学习之IOC容器BeanFactory和ApplicationContext(三)
- (1.0)Spring的IoC容器之BeanFactory
- Spring揭秘 学习笔记一 (Spring的IoC容器 一)
- Spring揭秘 学习笔记一 (Spring的IoC容器 二)
- Spring揭秘 学习笔记三 (Spring的IoC容器 ApplicationContext)
- 《Spring揭秘》第四章 读书笔记 —— BeanFactory的XML之旅
- Spring--IoC--创建BeanFactory容器
- Spring揭秘:第一章-第六章IOC与BeanFactory
- Spring框架之IoC容器—BeanFactory接口
- spring学习之IOC容器
- Spring IoC源码之BeanFactory
- 一步一步学习Spring(2)-Spring IOC 之BeanFactory
- 好记性不如烂笔头83-spring3学习(4)-spring的BeanFactory(IoC容器)
- 《step1:tiny Spring IoC学习一》——最基本的容器BeanFactory
- PHP数组
- linux硬件信息查看
- ExtJs 中Grid根据列表中某列的值,修改整行数据的背景色 ExtJS版本为2.3
- windows+ubuntu多系统启动盘
- Linux 替换^M字符方法
- 【Spring揭秘】------ 第四章学习 Spring的IoC容器之BeanFactory 01
- 交叉编译pcre、sqlite3
- AndroidAutoLayout
- iOS RGB色值宏定义设置
- Liblinphone 3.9.1中文--Modules--Managing proxies
- 因特网传输层协议
- js中做一个button按钮,页面开始五秒钟之后才可进行点击,并且要求按钮上实时显示当前所剩秒数
- spring boot 学习--01--springboot开始
- Java核心技术之脚本和编译