本篇博客的主要内容:
(1)本篇博客,就介绍另一种实例化对象的方法:利用工厂实例化对象;即下面红色部分:【基于静态工厂实例化对象】和【基于工厂实例实例化对象】
说明:
(1)在【Spring IoC容器与Bean管理6:使用XML方式实现Spring IoC一:基于构造方法实例化对象,之基于【默认构造方法】实例化对象;】和【Spring IoC容器与Bean管理7:使用XML方式实现Spring IoC二:基于构造方法实例化对象,之基于【带参构造方法】实例化对象;】介绍了利用构造方法来实例化对象,在实际中,构造方法实例化对象占了90%以上。所以,本篇博客的内容,在实际中用的并不多,但也需要知道。
(2)关于工厂(工厂通常就是指工厂模式),可以快速浏览下【工厂模式一:设计模式简介;工厂模式简介&案例;】及附近相关文章;
(3)工厂的根本用途就是隐藏创建类的细节,通过一个额外的工厂类,来组织和创建我们所需的对象;
(4)按照工厂的表现形式,又可以分为【静态工厂】和【工厂实例】;
(5)本篇博客的内容,在实际中使用的并不多,所以做一般性了解即可;
目录
2.在applicationContext.xml配置一个:去调用AppleStaticFactory这个工厂类的createSweetApple静态方法
1.创建演示【工厂实例方法实例化对象】的类:AppleFactoryInstance
(2)使用【工厂实例化对象】,我们可以在创建对象的同时添加一些其他逻辑:
一:基于静态工厂实例化对象
1.创建一个静态工厂类
AppleStaticFactory类:
package com.imooc.spring.ioc.factory; import com.imooc.spring.ioc.entity.Apple; /** * 静态工厂:通过静态方法创建对象,隐藏创建的细节 */ public class AppleStaticFactory { public static Apple createSweetApple() { Apple apple = new Apple(); apple.setTitle("红富士"); apple.setOrigin("欧洲"); apple.setColor("红色"); return apple; } }(1)之所以是静态工厂,就是用于创建对象的方法是静态的;如上面的createSweetApple这个方法是static的;
(2)createSweetApple()方法是static的,所以这个方法是属于AppleStaticFactory这个工厂类本身的;
那么,Spring IoC容器,如何通过这个静态工厂类,去调用createSweetApple方法,获取对应的Apple对象?
2.在applicationContext.xml配置一个<bean>:去调用AppleStaticFactory这个工厂类的createSweetApple静态方法
(1)上面配置以后,就可以在程序运行时,通过AppleStaticFactory这个工厂类的createSweetApple静态方法,来完成对象的创建,然后这个创建的对象的id设置为apple4,被Spring IoC容器管理;
(2)很容易理解,因为createSweetApple()方法是静态的,即这个方法是直接属于工厂类;所以,上面的<bean>就有点通过类直接去调用静态方法的赶脚;
3.测试
如果放开断点,让其彻底执行,AppleStaticFactory静态工厂类中的createSweetApple静态方法所返回的apple对象,就会被放入到Spring IoC容器中;
4.【基于静态工厂实例化对象】的合理性解释
疑问?
合理性解释:
第一条:还是多少有点【对象之间解耦】的赶脚的:
即,【基于静态工厂实例化对象】的主要目的是在IoC容器之外,通过程序代码的方式来组织对象。这样做的好处是:
第二条:可以在创建对象的同时,附加一些其他的逻辑
二:基于工厂实例方法实例化对象
1.创建演示【工厂实例方法实例化对象】的类:AppleFactoryInstance
已知,静态工厂中,静态方法是属于工厂类本身,不属于工厂的对象;
AppleFactoryInstance:
package com.imooc.spring.ioc.factory; import com.imooc.spring.ioc.entity.Apple; /** * 工厂实例方法创建对象:指IoC容器对工厂类进行实例化并调用对应的实例方法创建对象 */ public class AppleFactoryInstance { /** * 这个方法不是static的,即这个方法是属于工厂类对象的,不是属于工厂类本身的; * @return */ public Apple createSweetApple() { Apple apple = new Apple(); apple.setTitle("红富士"); apple.setOrigin("欧洲"); apple.setColor("红色"); return apple; } }(1)可以到,createSweetApple()方法不是静态的,即这个方法是隶属于AppleFactoryInstance类的对象的;
2.在applicationContext.x3ml中配置
(1)因为【createSweetApple()方法不是静态的,即这个方法是隶属于AppleFactoryInstance类的对象的】;所以,上面就先需要一个<bean>将AppleFactoryInstance类的对象添加到Spring IOC容器中;;;然后再使用另外一个<bean>去调用对象中的createSweetApple()方法,获取最终的Apple对象;
3.运行验证

三:summary:比较重要!
(1)使用【工厂实例化对象】也体现了对象解耦的意味:
如果我们的需求改变了,即有一个苹果比“红富士”更甜,那么我们只需要修改工厂类中的代码就行了,不用修改applicationContext.xml中的内容。虽然也是修改了代码,但是工厂模块在某种程度上可以看成是一个与其他代码相对隔绝的独立模块,也算是一种【对象与对象之间的解耦吧】
(2)使用【工厂实例化对象】,我们可以在创建对象的同时添加一些其他逻辑:
然后,由于【基于静态工厂实例化对象】和【基于工厂实例实例化对象】是通过代码来实例化对象,所以我们可以在实例化对象的同时,比较容易的添加其他的逻辑;这提供了一种灵活性,这也是Spring提供【基于工厂实例化对象】的用意所在;
(3)使用【工厂实例化对象】,用的比较少
在实际中,随着Spring的功能越来越强大,【基于工厂实例化对象】的使用越来越少了;










600

被折叠的 条评论
为什么被折叠?



