跳到主要内容

吃透Spring源码(十):Spring实例化Bean的五种方式源码解析

一,概述

对于我们Java来说,创建对象无非就是new或者通过反射两种方式。

Spring中实例化对象一般是通过反射来实现的,但是Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。

我们大致可以总结出以下五种实例化bean的方式:

1、 实现InstantiationAwareBeanPostProcessor接口;
2、 实现FactoryBean接口;
3、 通过Supplier接口;
4、 工厂方法factory-method;
5、 通过反射;

二,实现InstantiationAwareBeanPostProcessor接口

MyInstantiationAwareBeanPostProcessor.java

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {


@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {


if (beanName.equals("a")) {


return new B();
}
return null;
}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="a" class="com.bobo.A"></bean>
<bean class="com.bobo.MyInstantiationAwareBeanPostProcessor"></bean>
</beans>