package com.xushu.circulardependencies.One;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/***
* @Author 徐庶
* @Slogan 致敬大师,致敬未来的你
*/
public class XuShuApplicationContext {// spring implements BeanFactory {
private Map<String, BeanDefinition> beanDefinitionMap = new LinkedHashMap<>(256);
// 一级缓存 、单例池
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
// 二级级缓存 多线程线程安全, 提高性能 。
private final Map<String, Object> ealySingletonObjects = new ConcurrentHashMap<>(256);
// 三级缓存, 保证Bean创建规范
private final Map<String, ObjectFactory> factoriesSingletonObjects = new ConcurrentHashMap<>(256);
public XuShuApplicationContext() throws Exception {
// 加载ioc容器: 创建所有的bean
refresh();
}
// ioc容器加载
private void refresh() throws Exception {
// 1.解析配置 注册BeanDefinition
loadBeanDefinitions();
// 创建所有的bean
finishBeanFactoryInitialization();
}
// 创建所有的bean
private void finishBeanFactoryInitialization() throws InstantiationException, IllegalAccessException {
// 循环所有的beanDefinition
for (String beanName : beanDefinitionMap.keySet()) {
getBean(beanName);
}
// 一个个去调用getBean创建bean
}
// 创建和获取Bean
public Object getBean(String beanName) throws InstantiationException, IllegalAccessException {
// 1. 判断bean是否已经创建
Object beanInst=getSingleton(beanName);
// 1.2 如果已经创建返回
if(beanInst!=null){
return beanInst;
}
synchronized(singletonObjects) {
// 1. 判断bean是否已经创建
beanInst=getSingleton(beanName);
// 1.2 如果已经创建返回
if(beanInst!=null){
return beanInst;
}
// 1.1 如果没有创建 创建
// 2. 实例化 BeanDefinition.BeanClass.newInstance()
RootBeanDefinition rootBeanDefinition = (RootBeanDefinition) beanDefinitionMap.get(beanName);
Class<?> beanClass = rootBeanDefinition.getBeanClass();
Object bean = beanClass.newInstance();
// 判断当前是不是循环依赖
factoriesSingletonObjects.put(beanName, () -> {
JdkProxyBeanPostProcessor jdkProxyBeanPostProcessor = new JdkProxyBeanPostProcessor();
Object aopBean = jdkProxyBeanPostProcessor.getEarlyBeanReference(bean, beanName);
return aopBean;
});
// 3.属性注入 @Autowired
Field[] declaredFields = beanClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
Autowired annotation = declaredField.getAnnotation(Autowired.class);
if (annotation != null) {
String name = declaredField.getName();
Object beanB = getBean(name);
// 赋值
declaredField.setAccessible(true);
declaredField.set(bean, beanB);
}
}
// 4. 初始化 AOP 动态
// 5.放入一级缓存
singletonObjects.put(beanName, bean);
ealySingletonObjects.remove(beanName);
factoriesSingletonObjects.remove(beanName);
return bean;
}
}
// 判断bean是否存在
private Object getSingleton(String beanName) {
if(singletonObjects.containsKey(beanName)){
return singletonObjects.get(beanName);
}
synchronized (singletonObjects) {
// 如果二级有就说明当前是循环依赖
if (ealySingletonObjects.containsKey(beanName)) {
return ealySingletonObjects.get(beanName);
}
if(factoriesSingletonObjects.containsKey(beanName)){
ObjectFactory objectFactory = factoriesSingletonObjects.get(beanName);
Object beanAop = objectFactory.getObject();
ealySingletonObjects.put(beanName,beanAop);
return beanAop;
}
}
return null;
}
/**
*
* 根据配置信息创建BeanDefinition 会根据配置信息动态创建
*/
private void loadBeanDefinitions() {
// 创建A BeanDefinition
RootBeanDefinition aBeanDefinition = new RootBeanDefinition(AService.class);
// 创建B BeanDefinition
RootBeanDefinition bBeanDefinition = new RootBeanDefinition(BService.class);
beanDefinitionMap.put("aService", aBeanDefinition);
beanDefinitionMap.put("bService", bBeanDefinition);
}
}