从思想层面上分析工厂是如何实现的

为什么应用工厂之后就能够通过工厂创建对象呢?

从编码流程分析 spring 底层实现

对于一个应用,我们首先从编码的角度入手,先看看逻辑书写上如何调用 spring 工厂生产对象。

应用 spring 框架的主要流程

第一步,首先创建一个实体类,作为 spring 工厂生产的产品,在这里给出一个Account

1
2
3
4
5
public class Account implements Serializable {
private String name;
private String password;
//此处省略实体类内的get与set方法
}

第二步,我们在已经创建了实体类的情况下,对 spring 配置文件进行配置,在 xml 文件内创建 bean 标签如下

1
<bean id="account" class="com.AnselYuki.Account"/>

第三步,在项目内使用 JUnit 单元测试书写一个方法进行测试

1
2
3
4
5
6
@Test
public void test(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Account account=(Account) ctx.getBean("account");
System.out.println("account = " + account);
}

spring 框架内部的执行流程

我们已经成功的应用了 spring 框架,在上面的例子中,最先执行的是单元测试中的代码,则执行步骤如下

  1. 通过ClassPathXmlApplicationContext工厂读取配置文件applicationContext.xml

  2. 在第一步中读取配置文件,获取 bean 标签相关的值,并立即在框架内部通过反射创建对象

    1
    2
    Class<?> clazz = Class.forName("com.AnselYuki.Account");
    account = clazz.newInstance();
  3. 通过 getBean 方法返回生产的对象

反射创建对象底层一定会调用对象自己的构造方法,默认调用无参构造方法

反射创建对象等效于使用new创建对象

若一个对象没有无参构造方法,则 spring 工厂会抛出异常

若一个对象的构造方法修饰成私有的,spring 工厂同样能够调用无参构造方法,即 Spring 工厂可以调用对象私有的构造方法创建对象