spring原理(二)
spring的基础容器实现
beanFacrory(接口定义最基础获取bean的方法)
public interface BeanFactory {
Object getBean(String name) throws BeansException;
/**
* 根据名称和类型查找bean
*
* @param name
* @param requiredType
* @param <T>
* @return
* @throws BeansException
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
boolean containsBean(String name);
}
SingletonBeanRegistry(定义singleton添加与获取的方法)
package org.springframework.beans.factory.config;
public interface SingletonBeanRegistry {
Object getSingleton(String beanName);
void addSingleton(String beanName, Object SingletonObject);
}
DefaultSingletionBeanRegisrty(实现SingletonBeanRegistry接口获取/设置三级缓存bean)
package org.springframework.beans.factory.supper;
import org.springframework.beans.factory.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.SingletonBeanRegistry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {
private Map<String, Object> singletonObjects = new HashMap<>();
private Map<String, Object> earlySingletonObjects = new HashMap<>();
private Map<String, ObjectFactory<?>> singletonFactorys = new HashMap<String, ObjectFactory<?>>();
//用于销毁
private final Map<String, DisposableBean> disposableBeans = new HashMap<>();
@Override
public Object getSingleton(String beanName) {
Object singletonObject = singletonObjects.get(beanName);
if (singletonObject == null) {
singletonObject = earlySingletonObjects.get(beanName);
if (singletonObject == null) {
ObjectFactory<?> objectFactory = singletonFactorys.get(beanName);
if (objectFactory != null) {
singletonObject = objectFactory.getObject();
earlySingletonObjects.put(beanName, singletonObject);
singletonFactorys.remove(singletonObject);
}
}
}
return singletonObject;
}
@Override
public void addSingleton(String beanName, Object singletonObject) {
singletonObjects.put(beanName, singletonObject);
earlySingletonObjects.remove(beanName);
singletonFactorys.remove(beanName);
}
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
singletonFactorys.put(beanName, singletonFactory);
}
public void registerDisposableBean(String beanName, DisposableBean bean) {
disposableBeans.put(beanName, bean);
}
public void destroySingletons() {
ArrayList<String> beanNames = new ArrayList<>(disposableBeans.keySet());
for (String beanName : beanNames) {
DisposableBean disposableBean = disposableBeans.remove(beanName);
try {
disposableBean.destroy();
} catch (Exception e) {
throw new BeansException("Destroy method on bean with name '" + beanName + "' threw an exception", e);
}
}
}
}
AbstractBeanFactory
1.从三级缓存DefaultSingletionBeanRegisrty类中获取bean。
2.三级缓存没有从DefaultListableBeanFactory.registerBeanDefinition注册进入的map中获取BeanDefinition。
package org.springframework.beans.factory.supper;
import org.springframework.beans.factory.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.core.convert.ConversionService;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements ConfigurableBeanFactory {
private final Map<String, Object> factoryBeanObjectCache = new HashMap<>();
private ConversionService conversionService;
public Object getBean(String beanName) throws BeansException {
//从三级缓存获取
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null) {
return getObjectForBeanInstance(sharedInstance, beanName);
}
BeanDefinition beanDefinition = getBeanDefinition(beanName);
Object bean = createBean(beanName, beanDefinition);
return getObjectForBeanInstance(bean, beanName);
}
public Object getObjectForBeanInstance(Object beanInstance, String beanName) {
Object object = beanInstance;
if (beanInstance instanceof FactoryBean) {
FactoryBean factoryBean = (FactoryBean) beanInstance;
try {
if (factoryBean.isSingleton()) {
//从缓存获取
object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
object = factoryBean.getObject();
this.factoryBeanObjectCache.put(beanName, object);
}
} else {
object = factoryBean.getObject();
}
} catch (Exception e) {
throw new BeansException("FactoryBean threw exception on object[" + beanName + "] creation", e);
}
}
return object;
}
protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException;
protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException;
@Override
public ConversionService getConversionService() {
return conversionService;
}
@Override
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
}
3.从BeanDefinition对象里面PropertyValues取出并设置属性。
package org.springframework.beans.factory.supper;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.TypeUtil;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeansException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.SingletonBeanRegistry;
import org.springframework.core.convert.ConversionService;
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements BeanFactory {
private InstantiationStrategy instantiationStrategy = new SimpleInstantiationStrategy();
@Override
protected BeanDefinition getBeanDefinition(String beanName) throws BeansException {
return null;
}
protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException {
//如果bean需要代理,则直接返回代理对象
// Object bean = resolveBeforeInstantiation(beanName, beanDefinition);
// if (bean != null) {
// return bean;
// }
return doCreateBean(beanName, beanDefinition);
}
protected Object doCreateBean(String beanName, BeanDefinition beanDefinition) {
Object bean;
try {
//通过简单构造实例化实现类
bean = createBeanInstance(beanDefinition);
//先添加缓存提前暴露
if (beanDefinition.isSingleton()) {
Object finalBean = bean;
addSingletonFactory(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
return getEarlyBeanReference(beanName, beanDefinition, bean);
}
});
}
//为bean添加属性内容
applyPropertyValue(beanName, bean, beanDefinition);
} catch (Exception e) {
throw new BeansException("Instantiation of bean failed", e);
}
return bean;
}
protected void applyPropertyValue(String beanName, Object bean, BeanDefinition beanDefinition) {
try {
for (PropertyValue propertyValue : beanDefinition.getPropertyValues().getPropertyValues()) {
String name = propertyValue.getName();
Object value = propertyValue.getValue();
//引用对象先实例化对象
if (value instanceof BeanDefinition) {
BeanReference beanReference = (BeanReference) value;
value = getBean(beanName);
} else {
//类型转化
Class<?> sourceType = value.getClass();
Class<?> targetType = (Class<?>) TypeUtil.getFieldType(bean.getClass(), name);
ConversionService conversionService = getConversionService();
if (conversionService != null) {
if (conversionService.canConvert(sourceType, targetType)) {
value = conversionService.convert(value, targetType);
}
}
//通过反射设置属性
BeanUtil.setFieldValue(bean, name, value);
}
}
} catch (Exception e) {
}
}
protected Object getEarlyBeanReference(String beanName, BeanDefinition beanDefinition, Object bean) {
//暂收先返回
return bean;
}
protected Object createBeanInstance(BeanDefinition beanDefinition) {
return instantiationStrategy.instantiate(beanDefinition);
}
}
每天坚持,终会抵达!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了