如何实现手写模拟Spring底层原理的扫描、创建单例原型bean等操作?
摘要:代码结构 模拟spring源码 BeanDefinition public class BeanDefinition { private Class aClass; private String scope; private Boolean
代码结构
模拟spring源码
BeanDefinition
public class BeanDefinition {
private Class aClass;
private String scope;
private Boolean lazy;
public Class getaClass() {
return aClass;
}
public void setaClass(Class aClass) {
this.aClass = aClass;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public Boolean getLazy() {
return lazy;
}
public void setLazy(Boolean lazy) {
this.lazy = lazy;
}
}
BeanNameAware
public interface BeanNameAware {
void setBeanName(String beanName);
}
BeanPostProcessor
public interface BeanPostProcessor {
default Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
/**
* 初始化后,创建bean的过程中,每一个bean都会调用此方法,也可以单独判断,可以用来实现aop
*/
default Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
}
InitializingBean
public interface InitializingBean {
void afterPropertiesSet();
}
MyApplicationContext
public class MyApplicationContext {
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
//单例池
private Map<String, Object> singletonObjects = new HashMap<>();
private List<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();
public MyApplicationContext(Class<MyAppConfig> myAppConfigClass) throws ClassNotFoundException, NoSuchMethodException {
//扫描 构建Bean定义,放在beanDefinitionMap中
scan(myAppConfigClass);
//扫描完,遍历beanDefinitionMap,找出所有的单例bean,创建单例bean并放在单例池中
//单例模式先创建bean再放在单例池中
Set<Map.Entry<String, BeanDefinition>> entries = beanDefinitionMap.entrySet();
for (Map.Entry<String, BeanDefinition> entry : entries) {
String beanName = entry.getKey();
BeanDefinition beanDefinition = entry.getValue();
