手写高仿真Spring框架-依赖注入DI

7 篇文章 0 订阅

手写高仿真Spring框架

流行词:顶层设计 依赖注入

参考代码:https://gitee.com/li-lixiang/lean-spring-2.0.git

在上衣篇blog中,已经实现Spring IOC容器的初始化,接下来对伪容器(真正的容器时保存BeanWrapper对象的)中的类名,进行实例注入(非延时加载)。也就是完成依赖注入。

依赖注入

  1. 初始化(实例化)
    • 通过读取伪容器中的BeanDefinition对象,获取类信息,从而通过反射机制进行实例化对象。
    • 而Spring的做法非此直接,而是用到BeanWrapper对象进行一次包装。再将BeanWrapper对象存到真的IOC容器中。
  2. 注入(单例,多例的处理,相互依赖的情况处理BeanWrapper包装器模式处理)

初始化

  1. 拿到需要实例化的对象
  2. 反射实例化,得到一个对象
  3. 将实例化对象通过BeanWrapper封装
  4. 将封装的BeanWrapper对象,缓存到factoryBeanObjectCache
    private Object instantiateBean(String beanName, GPBeanDefinition gpBeanDefinition) {
        //1、拿到要实例化的对象的类名
        String className = gpBeanDefinition.getBeanClassName();

        //2、反射实例化,得到一个对象
        Object instance = null;
        try {
//            gpBeanDefinition.getFactoryBeanName()
            //假设默认就是单例,细节暂且不考虑,先把主线拉通
            if(this.factoryBeanObjectCache.containsKey(className)){
                instance = this.factoryBeanObjectCache.get(className);
            }else {
                Class<?> clazz = Class.forName(className);
                instance = clazz.newInstance();

                GPAdvisedSupport config = instantionAopConfig(gpBeanDefinition);
                config.setTargetClass(clazz);
                config.setTarget(instance);

                //符合PointCut的规则的话,闯将代理对象
                if(config.pointCutMatch()) {
                    instance = createProxy(config).getProxy();
                }

                this.factoryBeanObjectCache.put(className,instance);
                this.factoryBeanObjectCache.put(gpBeanDefinition.getFactoryBeanName(),instance);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return instance;
    }

注入

  1. 判断只有加了注解的类,才执行依赖注入
  2. 获得所有的fields,然后对其处理,对所有需要依赖注入的fields,也就是将factoryBeanObjectCache中获取实例化的对象进行注入
    private void populateBean(String beanName, GPBeanDefinition gpBeanDefinition, GPBeanWrapper gpBeanWrapper) {
        Object instance = gpBeanWrapper.getWrappedInstance();

//        gpBeanDefinition.getBeanClassName();

        Class<?> clazz = gpBeanWrapper.getWrappedClass();
        //判断只有加了注解的类,才执行依赖注入
        if(!(clazz.isAnnotationPresent(GPController.class) || clazz.isAnnotationPresent(GPService.class))){
            return;
        }

        //获得所有的fields
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if(!field.isAnnotationPresent(GPAutowired.class)){ continue;}

            GPAutowired autowired = field.getAnnotation(GPAutowired.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();
            }

        }

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,感谢您的提问。关于手写一个 Spring 框架,这是一个非常复杂的任务,需要深入了解 Spring 框架的原理和设计思想。如果您想要手写一个 Spring 框架,建议您先学习 Spring 框架的基本原理和核心组件,例如 IoC 容器、AOP、MVC 等。然后,您可以根据自己的需求和业务场景,逐步实现自己的 Spring 框架。当然,这需要您具备较强的 Java 编程能力和系统设计能力。希望我的回答能够帮助到您。 ### 回答2: 手写一个Spring框架是一项复杂且庞大的任务,需要深入理解Spring框架的核心概念和原理。以下是一个简要的步骤指南: 1. 了解Spring框架的核心概念和原理,包括依赖注入、面向切面编程、控制反转等。 2. 创建一个独立的IoC容器,用于管理对象的创建和依赖注入。可以通过反射机制实现对象的自动注入,同时考虑循环依赖的情况。 3. 实现一个简单的AOP框架,通过动态代理机制实现方法拦截和增强。可以使用JDK自带的动态代理或者CGLIB库等。 4. 设计和实现一个MVC框架,用于处理Web请求和返回结果。可以使用Servlet作为底层技术,设计并实现自己的DispatcherServlet。 5. 创建一个配置文件解析器,用于解析Spring配置文件中的Bean定义和依赖关系。可以使用DOM、SAX、XML解析器等。 6. 编写一个Bean工厂,负责管理Bean的生命周期和依赖关系。可以在Bean创建时对其进行初始化和销毁的处理。 7. 实现一个简单的事务管理器,用于处理数据库事务。可以使用JDBC或者类似的持久化框架手写一个Spring框架需要深入理解Java反射、动态代理、设计模式等知识,并具备一定的编程和架构能力。以上只是一个简要的步骤指南,实际的开发过程中还需要考虑到更多的细节和边界情况。因此,对于初学者来说,手写一个完整的Spring框架可能是一个挑战,建议先熟悉和使用官方提供的Spring框架,通过实践逐步深入理解其原理和内部实现,再考虑手写一个简化的版本。 ### 回答3: 手写一个Spring框架是一项庞大而复杂的任务,需要深入理解Spring的设计原理和内部机制。以下是手写一个简化版Spring框架级步骤: 第一步:实现IoC容器 IoC(控制反转)是Spring框架的核心概念,通过实现一个简单的IoC容器,来管理对象的创建和依赖注入。容器可以采用单例模式,在初始化时读取配置文件,通过反射实例化并注入依赖。容器会根据配置文件中的Bean定义,创建并管理对象之间的依赖关系。 第二步:实现依赖注入 依赖注入Spring框架的另一个重要概念,通过实现依赖注入功能,实现对象之间的解耦。可以通过反射遍历对象的属性,扫描注解或配置文件,将依赖的对象自动注入到属性中。 第三步:实现AOP功能 AOP(面向切面编程)是Spring框架中提供的另一个重要功能,通过实现AOP功能,能够在不修改原有代码的情况下,对业务逻辑进行增强。可以使用动态代理等机制,在目标方法的前后增加额外的操作。 第四步:实现Web MVC功能 Spring框架还提供了强大的Web MVC功能,通过实现简化版的请求处理、路由和视图解析等功能,来实现一个基本的Web应用。可以通过Servlet或者自定义HttpHandler来处理请求,并使用模板引擎等技术进行视图解析和渲染。 第五步:实现其他特性 除了上述核心功能外,Spring框架还提供了诸如事务管理、数据访问、安全等一系列扩展功能。可以根据实际需要,逐步实现这些特性。 最后,为了保持代码的可维护性和可扩展性,建议使用设计模式、模块化的方式来实现框架的各个功能。此外,持续学习和了解Spring框架的最新发展和技术变化,可以帮助优化和提升手写框架的质量和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值