/*** 按之前源码分析的套路,IOC、DI、MVC、AOP*/
public class V1ApplicationContext extends V1DefaultListableBeanFactory implements V1BeanFactory {private String [] configLoactions;private V1BeanDefinitionReader reader;//单例的IOC容器缓存private Map<String,Object> singletonObjects = new ConcurrentHashMap<String, Object>();//通用的IOC容器private Map<String,V1BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<String, V1BeanWrapper>();public V1ApplicationContext(String... configLoactions){this.configLoactions = configLoactions;try {refresh();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void refresh() throws Exception{//1、定位,定位配置文件reader = new V1BeanDefinitionReader(this.configLoactions);//2、加载配置文件,扫描相关的类,把它们封装成BeanDefinitionList<V1BeanDefinition> beanDefinitions = reader.loadBeanDefinitions();//3、注册,把配置信息放到容器里面(伪IOC容器)doRegisterBeanDefinition(beanDefinitions);//4、把不是延时加载的类,有提前初始化doAutowrited();}//只处理非延时加载的情况private void doAutowrited() {for (Map.Entry<String, V1BeanDefinition> beanDefinitionEntry : super.beanDefinitionMap.entrySet()) {String beanName = beanDefinitionEntry.getKey();if(!beanDefinitionEntry.getValue().isLazyInit()) {try {getBean(beanName);} catch (Exception e) {e.printStackTrace();}}}}private void doRegisterBeanDefinition(List<V1BeanDefinition> beanDefinitions) throws Exception {for (V1BeanDefinition beanDefinition: beanDefinitions) {if(super.beanDefinitionMap.containsKey(beanDefinition.getFactoryBeanName())){throw new Exception("The “" + beanDefinition.getFactoryBeanName() + "” is exists!!");}super.beanDefinitionMap.put(beanDefinition.getFactoryBeanName(),beanDefinition);}//到这里为止,容器初始化完毕}public Object getBean(Class<?> beanClass) throws Exception {return getBean(beanClass.getName());}//依赖注入,从这里开始,通过读取BeanDefinition中的信息//然后,通过反射机制创建一个实例并返回//Spring做法是,不会把最原始的对象放出去,会用一个BeanWrapper来进行一次包装//装饰器模式://1、保留原来的OOP关系//2、我需要对它进行扩展,增强(为了以后AOP打基础)public Object getBean(String beanName) throws Exception {V1BeanDefinition V1BeanDefinition = this.beanDefinitionMap.get(beanName);Object instance = null;//这个逻辑还不严谨,自己可以去参考Spring源码//工厂模式 + 策略模式V1BeanPostProcessor postProcessor = new V1BeanPostProcessor();postProcessor.postProcessBeforeInitialization(instance,beanName);instance = instantiateBean(beanName,V1BeanDefinition);//3、把这个对象封装到BeanWrapper中V1BeanWrapper beanWrapper = new V1BeanWrapper(instance);//singletonObjects//factoryBeanInstanceCache//4、把BeanWrapper存到IOC容器里面
//        //1、初始化//        //class A{ B b;}
//        //class B{ A a;}
//        //先有鸡还是先有蛋的问题,一个方法是搞不定的,要分两次//2、拿到BeanWraoper之后,把BeanWrapper保存到IOC容器中去this.factoryBeanInstanceCache.put(beanName,beanWrapper);postProcessor.postProcessAfterInitialization(instance,beanName);//        //3、注入populateBean(beanName,new V1BeanDefinition(),beanWrapper);return this.factoryBeanInstanceCache.get(beanName).getWrappedInstance();}private void populateBean(String beanName, V1BeanDefinition V1BeanDefinition, V1BeanWrapper V1BeanWrapper) {Object instance = V1BeanWrapper.getWrappedInstance();//        V1BeanDefinition.getBeanClassName();Class<?> clazz = V1BeanWrapper.getWrappedClass();//判断只有加了注解的类,才执行依赖注入if(!(clazz.isAnnotationPresent(V1Controller.class) || clazz.isAnnotationPresent(V1Service.class))){return;}//获得所有的fieldsField[] fields = clazz.getDeclaredFields();for (Field field : fields) {if(!field.isAnnotationPresent(V1Autowired.class)){ continue;}V1Autowired autowired = field.getAnnotation(V1Autowired.class);String autowiredBeanName =  autowired.value().trim();if("".equals(autowiredBeanName)){autowiredBeanName = field.getType().getName();}//强制访问field.setAccessible(true);try {//为什么会为NULL,先留个坑if(this.factoryBeanInstanceCache.get(autowiredBeanName) == null){ continue; }
//                if(instance == null){
//                    continue;
//                }field.set(instance,this.factoryBeanInstanceCache.get(autowiredBeanName).getWrappedInstance());} catch (IllegalAccessException e) {e.printStackTrace();}}}private Object instantiateBean(String beanName, V1BeanDefinition V1BeanDefinition) {//1、拿到要实例化的对象的类名String className = V1BeanDefinition.getBeanClassName();//2、反射实例化,得到一个对象Object instance = null;try {
//            V1BeanDefinition.getFactoryBeanName()//假设默认就是单例,细节暂且不考虑,先把主线拉通if(this.singletonObjects.containsKey(className)){instance = this.singletonObjects.get(className);}else {Class<?> clazz = Class.forName(className);instance = clazz.newInstance();this.singletonObjects.put(className,instance);this.singletonObjects.put(V1BeanDefinition.getFactoryBeanName(),instance);}}catch (Exception e){e.printStackTrace();}return instance;}public String[] getBeanDefinitionNames() {return this.beanDefinitionMap.keySet().toArray(new  String[this.beanDefinitionMap.size()]);}public int getBeanDefinitionCount(){return this.beanDefinitionMap.size();}public Properties getConfig(){return this.reader.getConfig();}
}

高仿真的类-ApplicationContext相关推荐

  1. 高仿真的类-ApplicationContextAware

    /*** 通过解耦方式获得IOC容器的顶层设计* 后面将通过一个监听器去扫描所有的类,只要实现了此接口,* 将自动调用setApplicationContext()方法,从而将IOC容器注入到目标类中 ...

  2. 高仿真的类-BeanDefinitionReader

    public class V1BeanDefinitionReader {private List<String> registyBeanClasses = new ArrayList&l ...

  3. 高仿真的类-DefaultListableBeanFactory

    public class V1DefaultListableBeanFactory extends V1AbstractApplicationContext{//存储注册信息的BeanDefiniti ...

  4. 高仿真的类-AbstractApplicationContext

    /*** IOC容器实现的顶层设计*/ public abstract class V1AbstractApplicationContext {//受保护,只提供给子类重写public void re ...

  5. 高仿真的类-BeanWrapper

    public class V1BeanWrapper {private Object wrappedInstance;private Class<?> wrappedClass;publi ...

  6. 高仿真的类-单例工厂的顶层设计

    /*** 单例工厂的顶层设计*/ public interface V1BeanFactory {/*** 根据beanName从IOC容器中获得一个实例Bean* @param beanName* ...

  7. 高仿真的类-请求参数映射

    /*** 请求参数映射**/ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public ...

  8. 高仿真的类-请求url

    /*** 请求url**/ @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Do ...

  9. 高仿真的类-页面交互

    /*** 页面交互**/ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @int ...

最新文章

  1. android标题栏(titlebar)显示进度条
  2. source insight删除保存路径为中文的project工程项目报错的解决办法
  3. 深度剖析Zabbix Web scenarios数据表结构
  4. 前端面试-综合问题版
  5. MySQL主从失败 错误Got fatal error 1236解决方法
  6. 三星note2+android8.0,放大版Note2 三星Galaxy Note8.0
  7. 开源项目中经常出现的七种错误
  8. Android之可伸缩的皮筋效果(贝塞尔曲线)的介绍
  9. 魅族16s Pro最新预热海报公布:将配备双扬声器
  10. 智乃的树旋转(easy version)(思维+暴力)
  11. webpack的CommonsChunkPlugin分析与优化
  12. APP营销案例分析------从西柚姨妈神庙看西柚经期助手的公关传播
  13. GUI制作信号分析的频域和时域分析
  14. e语言截图软件怎么保存在c盘,电脑截图文件保存在哪_电脑截图保存在哪里
  15. 【绘制矩形】已知二维平面矩形的对角线两点坐标,如何确定四个点的坐标
  16. Solidwork软件盗版
  17. Java中对数组降序排列
  18. 2000坐标系xy坐标几位_详解| 带你认识新一代坐标系——2000国家大地坐标系
  19. 休闲娱乐 - 夏日自制饮料
  20. RealSense相机在ros2环境的安装

热门文章

  1. 设计模式- 策略模式
  2. [RN] React Native 实现 类似京东 的 沉浸式状态栏和搜索栏
  3. 不同数据库间的数据访问--dblink
  4. 3章-字符串类型操作
  5. OAuth的MVC实现(微软)
  6. Codeforces 658D Bear and Polynomials【数学】
  7. ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图
  8. bootloader学习笔记
  9. ADO.NET的记忆碎片(六)
  10. 大话设计模式—备忘录模式