.
└── beans
├── BeansException.java
├── PropertyValue.java
├── PropertyValues.java
└── factory
├── BeanFactory.java
├── config
│ ├── BeanDefinition.java
│ ├── BeanReference.java
│ └── SingletonBeanRegistry.java
└── support
├── AbstractAutowireCapableBeanFactory.java
├── AbstractBeanFactory.java
├── BeanDefinitionRegistry.java
├── CglibSubclassingInstantiationStrategy.java
├── DefaultListableBeanFactory.java
├── DefaultSingletonBeanRegistry.java
├── InstantiationStrategy.java
└── SimpleInstantiationStrategy.java
.
└── test
├── ApiTest.java
└── bean
├── UserController.java
├── UserDao.java
└── UserService.java
/**
* 核心接口:定义获取 Bean 对象
* @author gusixue
* @date 2023/3/26
*/
public interface BeanFactory {
Object getBean(String beanName) throws BeansException;
Object getBean(String beanName, Object... args) throws BeansException;
}
/**
* 核心抽象类:实现获取 Bean 对象、定义获取 BeanDefinition 对象、定义创建 Bean 对象
* @author gusixue
* @date 2023/3/26
*/
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {
/**
* 获取无参 Bean 对象
* @param beanName Bean 对象唯一 id
* @return 返回创建好的 Bean 对象
* @throws BeansException 创建 Bean 对象失败
*/
@Override
public Object getBean(String beanName) throws BeansException {
Object bean = getSingletonBean(beanName);
if (null != bean) {
return bean;
}
BeanDefinition beanDefinition = getBeanDefinition(beanName);
return createBean(beanName, beanDefinition, null);
}
/**
* 获取有参 Bean 对象
* @param beanName Bean 对象唯一 id
* @param args Bean 对象参数
* @return 返回创建好的有参 Bean 对象
* @throws BeansException 创建 Bean 对象失败
*/
@Override
public Object getBean(String beanName, Object... args) throws BeansException {
Object bean = getSingletonBean(beanName);
if (null != bean) {
return bean;
}
BeanDefinition beanDefinition = getBeanDefinition(beanName);
return createBean(beanName, beanDefinition, args);
}
protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException;
protected abstract Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException;
}
/**
* 实现:获取单例 Bean 对象、注册单例 Bean 对象
* @author gusixue
* @date 2023/3/26
*/
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {
// 缓存 Bean 对象唯一 id 和单例 Bean 对象的容器
private Map<String, Object> singletonBeanMap = new HashMap<>();
/**
* 获取单例 Bean 对象
* @param beanName Bean 对象唯一 id
* @return 返回单例 Bean 对象
*/
@Override
public Object getSingletonBean(String beanName) {
return singletonBeanMap.get(beanName);
}
/**
* 注册单例 Bean 对象
* @param beanName Bean 对象唯一 id
* @param singletonBean 单例 Bean 对象
*/
protected void addSingleBean(String beanName, Object singletonBean) {
singletonBeanMap.put(beanName, singletonBean);
}
}
/**
* 实现:创建 Bean 对象,依赖注入(暂未考虑循环依赖)
* @author gusixue
* @date 2023/3/26
*/
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {
// 使用 JDK 进行 Bean 对象的实例化
// InstantiationStrategy instantiationStrategy = new SimpleInstantiationStrategy();
// 使用 Cglib 进行 Bean 对象的实例化
InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
/**
* 创建 Bean 对象并进行依赖注入
* @param beanName Bean 对象唯一 id
* @param beanDefinition 解耦封装 Bean 对象
* @param args Bean 对象参数
* @return 返回已经创建好的 Bean 对象
* @throws BeansException 创建 Bean 对象失败或者依赖注入失败
*/
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException {
Object bean = null;
try {
bean = createBeanInstance(beanName, beanDefinition, args);
applyPropertyValues(beanName, bean, beanDefinition);
} catch (Exception e) {
throw new BeansException("Instantiation of bean failed", e);
}
addSingleBean(beanName, bean);
return bean;
}
/**
* 选择正确的构造器,通过策略类创建 Bean 对象
* @param beanName Bean 对象唯一 id
* @param beanDefinition 解耦封装 Bean 对象
* @param args Bean 对象参数
* @return 返回已经创建好的 Bean 对象
*/
private Object createBeanInstance(String beanName, BeanDefinition beanDefinition, Object[] args) {
Constructor ctor = null;
Constructor<?>[] constructors = beanDefinition.getBeanClass().getConstructors();
/**
* 简化:根据传入参数选择最匹配的构造器
* Spring 实际会使用这个:getBean 传入参数与 BeanDefinition 中所有构造器权重相差最小的就使用那个构造器
* int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
* argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
*/
if (null != args) {
for (Constructor constructor : constructors) {
if (null != constructor && constructor.getParameterCount() == args.length) {
ctor = constructor;
break;
}
}
}
return instantiationStrategy.instantiate(beanName, beanDefinition, ctor, args);
}
/**
* Bean 对象进行依赖注入
* @param beanName Bean 对象唯一 id
* @param bean 创建好的 Bean 对象
* @param beanDefinition 解耦封装 Bean 对象
*/
private void applyPropertyValues(String beanName, Object bean, BeanDefinition beanDefinition) {
PropertyValues propertyValues = beanDefinition.getPropertyValues();
if (propertyValues != null && propertyValues.getPropertyValues() != null
&& propertyValues.getPropertyValues().size() > 0) {
for (PropertyValue propertyValue : propertyValues.getPropertyValues()) {
String propertyName = propertyValue.getName();
Object propertyValueObj = propertyValue.getValue();
if (propertyValueObj instanceof BeanReference) {
BeanReference beanReference = (BeanReference)propertyValueObj;
/**
* 注意这儿为了方便获取 Bean 对象没有加参数
* 注意 beanReference.getPropertyName() 可能与 propertyName 不一致,propertyName 方法与 setXxx 参数是一致的
*/
propertyValueObj = getBean(beanReference.getPropertyName());
}
// 直接反射未考虑 Cglib 代理的 Bean 对象,set 方法内部是基本数据类型
// String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
// bean.getClass().getMethod(setMethodName, propertyValueObj.getClass())
// .invoke(bean, propertyValueObj);
BeanUtil.setFieldValue(bean, propertyName, propertyValueObj);
}
}
}
public InstantiationStrategy getInstantiationStrategy() {
return instantiationStrategy;
}
public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) {
this.instantiationStrategy = instantiationStrategy;
}
}
/**
* 核心实现类:实现类获取 BeanDefinition 对象、注册 BeanDefinition 对象
* @author gusixue
* @date 2023/3/26
*/
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry{
// 缓存 Bean 对象唯一 id 和 BeanDefinition 对象的容器
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
/**
* 获取 BeanDefinition 对象
* @param beanName Bean 对象唯一 id
* @return 返回 BeanDefinition 对象
* @throws BeansException 获取不到 BeanDefinition 对象
*/
@Override
protected BeanDefinition getBeanDefinition(String beanName) throws BeansException {
BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
if (beanDefinition == null) {
throw new BeansException("No bean named '" + beanName + "' is defined");
}
return beanDefinition;
}
/**
* 注册 BeanDefinition 对象
* @param beanName Bean 对象唯一 id
* @param beanDefinition BeanDefinition 对象
*/
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
beanDefinitionMap.put(beanName, beanDefinition);
}
}
/**
* 定义:Bean 对象的 Class 以及属性信息
* @author gusixue
* @date 2023/3/26
*/
public class BeanDefinition {
// Bean 对象的 Class
private Class beanClass;
// Bean 对象的所有属性信息
private PropertyValues propertyValues;
public BeanDefinition(Class beanClass, PropertyValues propertyValues) {
this.beanClass = beanClass;
this.propertyValues = propertyValues;
}
... Getter、Setter、toString
}
/**
* 实现:创建有参 Bean 对象(无论是否有参),使用 JDK 反射
* @author gusixue
* @date 2023/3/27
*/
public class SimpleInstantiationStrategy implements InstantiationStrategy {
/**
* 通过 Cglib 代理实例化 Bean 对象
* @param beanName Bean 对象唯一 id
* @param beanDefinition 解耦封装 Bean 对象
* @param ctor Bean 对象构造器
* @param args Bean 对象参数
* @return 实例化 Bean 对象
* @throws BeansException 实例化 Bean 对象异常
*/
@Override
public Object instantiate(String beanName, BeanDefinition beanDefinition, Constructor ctor, Object[] args) throws BeansException {
Object bean = null;
Class clazz = beanDefinition.getBeanClass();
try {
if (null == args) {
bean = clazz.getDeclaredConstructor().newInstance();
} else {
bean = clazz.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args);
}
} catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
throw new BeansException("Failed to instantiate [" + clazz.getName() + "]", e);
}
return bean;
}
}
/**
* 实现:创建有参 Bean 对象(无论是否有参),使用 Cglib 代理
* @author gusixue
* @date 2023/3/27
*/
public class CglibSubclassingInstantiationStrategy implements InstantiationStrategy {
/**
* 通过 Cglib 代理实例化 Bean 对象
* @param beanName Bean 对象唯一 id
* @param beanDefinition 解耦封装 Bean 对象
* @param ctor Bean 对象构造器
* @param args Bean 对象参数
* @return 实例化 Bean 对象
* @throws BeansException 实例化 Bean 对象异常
*/
@Override
public Object instantiate(String beanName, BeanDefinition beanDefinition, Constructor ctor, Object[] args) throws BeansException {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(beanDefinition.getBeanClass());
// enhancer.setCallback(new NoOp() {
// @Override
// public int hashCode() {
// return super.hashCode();
// }
// });
enhancer.setCallback(NoOp.INSTANCE);
if (null == ctor) {
return enhancer.create();
}
return enhancer.create(ctor.getParameterTypes(), args);
}
}
/**
* 定义 Bean 对象的属性名与与属性值
* @author gusixue
* @date 2023/3/28
*/
public class PropertyValue {
// Bean 对象属性名
private String name;
// Bean 对象具体属性值
private Object value;
public PropertyValue(String name, Object value) {
this.name = name;
this.value = value;
}
... Getter、Setter、toString
}
参考:https://bugstack.cn/md/spring/develop-spring/2021-05-16-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%BC%80%E7%AF%87%E4%BB%8B%E7%BB%8D%EF%BC%8C%E6%89%8B%E5%86%99Spring%E8%83%BD%E7%BB%99%E4%BD%A0%E5%B8%A6%E6%9D%A5%E4%BB%80%E4%B9%88%EF%BC%9F.html