如何实现手写模拟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();
阅读全文