2.2 一颗豆子的经历--Bean的配置与实例化
本篇文章我们来介绍Bean的配置与实例化,让我们先来看一颗豆子的故事:
从前有一颗小豆子,准确的来说,他自己也不知道自己是一颗怎样的豆子。只是听祖辈上讲,它有一天会长成一棵参天“大豆”。为了完成理想,他去找了农民伯伯,但是农民伯伯并不确定它是一颗怎样的豆子,怎么能乱种呢?于是小豆子踏上了“证明自己的道路”。
一、小豆子的身份证---Bean的配置
首先小豆子找到了植物研究中心,据说任何植物的身世都可以查得到,顺便也可以办理一个身份证。小豆子抱着试试看的心态来到了这里,发现并不简单。这里豆子的命名是分全国性质的和地区性质的。小豆子也是头一次听说,在全国范围内来说,每一颗豆子一出生就会有一个编号(id),并附带一个豆子名称(name),还需要家庭住址(class),更有高级一点的豆子还会声明一下自己适合生长的区域(scope)。小豆子并不会搞这个,它请工作人员来帮忙。工作人员告诉他,申请身份认证就需要明确以上几点,科学一点的说法是Bean的配置。
其实在Spring中也一样,我们要使用任何一个Bean对象都需要知道他的信息,也就是需要提前配置他们,一般情况下我们使用的是XML文件的配置方式。
以下就是小豆子要要填写的信息的介绍,我已经为大家整理好了:

那么地区性命名是怎么回事呢,原来在某一地区内的豆子,当地政府都会详细的记录豆子属性的值,包括姓名,年龄,性别,年龄等等。而这些赋值需要使用特殊的标签包裹起来【constructor-arg(构造注入)、property(setter注入)】,还有的一个属性又包含多个属性,为了便于管理,他们把这种情况封装成一个对象,整体进行赋值(ref对象注入)。
其实,在Bean对象实现的每一个实体类中,都会存在这样的现象,除了私有普通属性使用还有私有对象属性,用于在实体类体中调用该对象的方法。
我也将这些属性整理出了一张表格,大家可以看一下。

了解了上述情况后,小豆子也是第一时间办好了一张身份证,让我们来看一下(setter方法注入):
二、小豆子上户口---Bean的实例化
光办理好身份证了,还不能证明自己是自己,还需要在户籍网站上注册一下。这里注册户口的方式有三种,一种是自己在家自己登录网站注册(构造方法实例化)、一种是通过中介注册户口(实例工厂实例化)、最后一种就是现场找工作人员办理(静态工厂实例化)。为了了解哪一种方式最为准时,小豆子也是做了很全面的功课呢,让我们一起来看看都做了那些功课吧:
1、构造方法实例化
首先小豆子了解的就是构造方法实例化,他指的就是通过对应Bean对象的实现类中的无参构造方法来实例化Bean。由于可以不借助外来力量就可以完成实例化,这里形象的解释为网上注册。
(1)首先需要在pom.xml中导入相关依赖
2、创建一个Bean的实现类,里面定义一个方法,用于显示内容
3、创建配置文件applicationContext.xml,使用构造方法实例化Bean对象
4、编写实现类BeanTest,测试实例化是否完成
5、运行测试类,查看结果

这样看来,自己在家注册户口也不难嘛。但是小豆子可是兜兜里不缺钱的那种,非得看看找中介能不能更方便一些。
2、实例工厂实例化
小豆子想了解一下中介是怎样帮忙注册户口的,于是打给一个有名的中介打了一个电话,了解到中介的操作步骤如下:
(1)在pom.xml中导入依赖(和构造实例化相同)
(2)创建实现类Bean,编写一个方法用于显示信息
(3)创建BeanFactory类(中介类),用于创建Bean的实例化对象。
(4)创建配置文件applicationContext.xml,用于声明Bean对象实例,Bean工厂实例,以及创建Bean的关系。
(5)编写测试类,查看运行结果

小豆子一看,貌似找中介还更加麻烦一些呢!而且把数据交给中介,还会有数据泄露的风险,还是算了吧。小豆子打算去现场找工作人员问一下,于是便有了下面的流程:
3、静态工程实例化
(1)在pom.xml中导入依赖(和构造实例化相同)
(2)创建实现类Bean,编写一个方法用于显示信息
(3)创建BeanFactory类(政府类),写一个静态方法用于创建Bean的实例化对象。
(4)创建配置文件applicationContext.xml,这里只用声明BeanFactory实例化对象(政府),调用其中的方法进行Bean额实例化对象。
(5)编写测试类,运行结果:

来都来啦,那就在这里找工作人员办理吧,小豆子最终成功的办理了户口注册。
三、小豆子有话说---三种实例化的流程比较
1、配置方面的区别
构造方法:
(1)创建实体类时,需要创建对应的无参构造
(2)需要创建对应的setter方法
(3)XMl配置文件中只需配置实体的bean
(4)测试类中使用Spring容器获取对象,用获取到的对象调用相应的方法。
实例化工厂
(1)需要创建对应的工厂类,使用工厂对象用来创建实体.
(2)xml配置文件里需要同时配置bean,和beanFactory的bean类型.
其中实体Bean需要声明工厂对象,工厂对象需要声明所使用的方法。
<bean id="beanFactory" class="com.hdc.bean.BeanFactory"></bean>
<bean id="bean1" factory-bean="beanFactory" factory-method="createBean"></bean>
(3)在测试类中,通过spring容器获取的仍然是原实体类的Bean对象,使用实体对象调用相应的方法。
静态工厂:
(1)需要创建对应的静态工厂类,用来创建实体.
(2)xml文件对应配置,需要声明实体Bean对象,声明工厂对象及所需要调用的方法。
<bean id="bean1" class="com.hdc.bean.BeanFactory" factory-method="beanCreate"></bean>
(3)在测试类中,获取的是工厂Bean对象,通过工厂对象创建实体对象,并使用实体对象调用相应的方法。
2、三种实例化流程
1》,使用类构造方法实例化(无参构造函数)
(1)获取spring容器,找到对应的Bean
(2)根据id值找到对应的Bean对象
(3)通过id值和实现类找到Bean,通过调用其构造方法,实现对象的创建
(4)使用创建好的实体对象调用对象方法。

2》使用静态工厂方法实例化
(1)从Spring容器中获取Bean对象
(2)配置实现类,创建beanFactory工厂对象
(3)调用工厂对象的BeanCreate方法,用于创建一个新的对象。
(4)使用BeanCreate方法创建一个实体对象
(5)通过调用BeanFactory对象间接创建实体对象。
(6)使用创建好的实体对象调用实体对象的方法。

3》使用实例工厂方法实例化
(1)从spring容器中获取Bean对象
(2)通过Bean表示找到对应的Bean对象
(3)通过id值找到已经配置的Bean实例化工厂对象
(4)通过实现类找到对应的实例化BeanFactory类
(5)根据工厂方法标签确定使用哪种工厂方法
(6)执行所选的工厂方法,创建对应的实体对象
(7)实体对象创建完成,在测试类中使用getBean方法获取创建好的实体对象。
(8)使用创建好的实体对象调用相应的方法

其实我们形象化的比喻是根据xml配置文件来讲的,静态工厂实例化的时候旨在xml里面配置了工厂类Bean对象,使用其自身的方法进行Bean对象的创建,所以类比做工作人员用自身的系统注册户口。而实例化工厂在配置的时候配置了两个Bean对象,一个是需要创建的实体类Bean对象,另一个是工厂类Bean对象(中介)。首先需要声明工厂类对象(中介),并声明实现类(地址)。然后再声明实体类Bean对象,并用factory-bean标签声明时用到的工厂类Bean对象(找的是哪一家中介),再使用factory-method确定使用工厂类的什么方法(需要办理什么业务),流程都是差不多的,只不过是方式不同方式不同罢了。

小豆子的故事就告一段落了,不知道大家喜不喜欢这种叙述风格,如果喜欢的话,我们会继续书结下回,继续小豆子的故事。
欢迎大家对文章中的错误进行评论指正,关注我,一起学习Spring一起进步。