Spring Framework(8)-两百行代码实现简单IoC容器

Spring Framework详解之IOC容器 1.什么是IOC (1)控制反转,把对象的创建和对象之间的调用过程,交给Spring进行管理 (2)目的:为了耦合度降低 阅读详情

一.前言

Spring中有两大重要功能,一是AOP(面向切面编程),主要使用的是动态代理技术

Java基础(9)-反射与动态代理

二是IOC(控制反转)技术。控制反转即将对象的创建权交给Spring IOC容器来管理,开发者只需要注重顶层类的创建,不必理会底层类的各种依赖创建关系,而是将它们交由Spring IOC来创建。

本文将使用 反射技术 + dom4j解析技术 + xml配置文件 的方式实现简单的IOC操作,模拟IOC中使用setter方法注入的方式。

二.时序图

最后的反射获取实例操作,都通过XmlApplicationContext来实现;BeanUtils用于解析xml中的配置并配置好Bean和Property的映射关系
在这里插入图片描述

三.代码实现

  • 代码整体结构
    核心代码位于XmlApplicationContext与BeanUtils中,一共两百多行代码
    在这里插入图片描述

  • beans包
    beans包存放了需要由IOC管理的bean

/**
 * @Auther: ARong
 * @Date: 2020/2/13 12:51 下午
 * @Description: Person类
 */
@Data
@ToString
public class Person {
    private String name;
    private Student student;
    public Person() {
        System.out.println(new Date() + ":Person类被创建");
    }
}


/**
 * @Auther: ARong
 * @Date: 2020/2/13 12:55 下午
 * @Description: Student类
 */
@Data
@ToString
public class Student {
    private String name;
    public Student() {
        System.out.println(new Date() + ":Student类被创建");
    }
}
  • xml包
    xml包下存放着applicationContext.xml,IOC容器中所有的类都在这里进行注册和配置
<?xml version="1.0" encoding="UTF-8"?>
<beans>

    <bean name="person" class="spring_demo.my_ioc.beans.Person" scope="prototype">
        <properties>
            <property name="name" value="ARong"/>
            <property name="student" ref="student"/>
        </properties>
    </bean>

    <bean name="student" class="spring_demo.my_ioc.beans.Student">
        <properties>
            <property name="name" value="XiaoMing"/>
        </properties>
    </bean>

</beans>
  • utils包
    utils包下定义了Bean和Property,分别用来描述bean的所需类信息以及属性信息,方便后序使用反射进行创建bean实例

  • Bean

/**
 * @Auther: ARong
 * @Date: 2020/2/13 1:00 下午
 * @Description: 描述对象实例的抽象Bean
 */
@Data
@ToString
public class Bean {
    private String name;// 类名
    private String classpath;// 类全限定路径
    private String scope = "singleton";// 默认单例
    private List<Property> properties = new ArrayList<>();// 所含属性
}
  • Property
/**
 * @Auther: ARong
 * @Date: 2020/2/13 1:03 下午
 * @Description: 描述类所含属性的抽象
 */
@Data
@ToString
public class Property {
    private String name;// 属性名
    private String value;// 属性值
    private String ref;// 引用对象
}

另外,BeanUtils用于封装对于xml配置信息解析的方法

  • BeanUtils
/**
 * @Auther: ARong
 * @Date: 2020/2/13 1:09 下午
 * @Description: Bean操作的工具类
 */
public class BeanUtils {
    public static final BeanUtils DEFAULT = new BeanUtils();
    private BeanUtils() {}

    /*
     * @Author ARong
     * @Description 使用dom4j解析xml文件内容,封装对应的bean与相应属性
     * @Date 2020/2/13 1:12 下午
     * @Param [xmlPath]
     * @return java.util.Map<java.lang.String,spring_demo.my_ioc.utils.Bean>
     **/
    public Map<String, Bean> getBeanConfig(String xmlPath) {
        HashMap<String, Bean> map = new HashMap<>();
        SAXReader saxReader = new SAXReader();
        Document document = null;
        try {
            document = saxReader.read(xmlPath);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Iterator<Element> beans = document.getRootElement().elementIterator();
        while (beans.hasNext()) {
            Element beanElement = beans.next();
            // 封装bean
            Bean bean = new Bean();
            bean.setName(beanElement.attributeValue("name"));
            bean.setClasspath(beanElement.attributeValue("class"));
            String scope = beanElement.attributeValue("scope");
            if (scope != null) {
                bean.setScope(scope);
            }
            // 封装属性
            ArrayList<Property> proList = new ArrayList<>();
            Iterator<Element> properties = beanElement.element("properties").elementIterator();
            while (properties.hasNext()) {
                Element propertyElement = properties.next();
                Property property = new Property();
                property.setName(propertyElement.attributeValue("name"));
                String value = propertyElement.attributeValue("value");
                String ref = propertyElement.attributeValue("ref");
                if (value != null) {
                    property.setValue(value);
                }
                if (ref != null) {
                    property.setRef(ref);
                }
                proList.add(property);
            }
            bean.setProperties(proList);
            map.put(bean.getName(), bean);
            // System.out.println(bean);
        }
        return map;
    }

}
  • context包
    context包下定义了BeanFactory接口以及XmlApplicationContext实现类,用于作为IOC容器以及通过getBean方法获取类的实例
  • BeanFactory
public interface BeanFactory {
    /*
     * @Author ARong
     * @Description 根据name获取对象的实例
     * @Date 2020/2/13 1:57 下午
     * @Param [name]
     * @return java.lang.Object
     **/
    Object getBean(String name);
}
  • XmlApplicationContext
/**
 * @Auther: ARong
 * @Date: 2020/2/13 2:03 下午
 * @Description:
 */
@Data
public class XmlApplicationContext implements BeanFactory {
    private Map<String, Bean> beanMap;
    private static final Map<String, Object> context = new HashMap<>();

    private XmlApplicationContext() {
    }

    public XmlApplicationContext(String xmlPath) {
        beanMap = BeanUtils.DEFAULT.getBeanConfig(xmlPath);
        // 将单例对象先创建并放入context中
        Set<Map.Entry<String, Bean>> entries = beanMap.entrySet();
        for (Map.Entry<String, Bean> entry : entries) {
            String key = entry.getKey();
            Bean value = entry.getValue();
            if ("singleton".equals(value.getScope())) {
                context.put(key, createBean(value));
            }
        }
    }

    /*
     * @Author ARong
     * @Description 通过beanName获取Object
     * @Date 2020/2/13 2:08 下午
     * @Param [name]
     * @return java.lang.Object
     **/
    @Override
    public Object getBean(String name) {
        Object instance = context.get(name);
        if (instance == null) {
            // 未创建的多例对象,每次都新创建
            instance = createBean(beanMap.get(name));
        }
        return instance;
    }

    /*
     * @Author ARong
     * @Description 通过反射创建相应的对象
     * @Date 2020/2/13 2:13 下午
     * @Param [name, beanMap, context]
     * @return java.lang.Object
     **/
    public Object createBean(Bean bean) {
        // 获取类全限定名
        String classpath = bean.getClasspath();
        Class<?> beanClass = null;
        try {
            beanClass = Class.forName(classpath);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // 创建class对象实例
        Object beanInstance = null;
        try {
            beanInstance = beanClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        // 获得Bean的属性,将其注入
        if(bean.getProperties() != null){
            for(Property prop : bean.getProperties()){
                // 获得要注入的元素名称
                String proName = prop.getName();
                // 根据属性名称获得对应属性的set方法
                Method setMethod = getSetMethod(beanInstance, proName);

                Object param = null;
                if(prop.getValue() != null){
                    // value属性注入
                    param = prop.getValue();

                }
                if(prop.getRef() != null){
                    // bean引用注入
                    //要注入其他bean到当前bean中,先从容器中查找,当前要注入的bean是否已经创建并放入容器中
                    Object existBean = context.get(prop.getRef());
                    if(existBean == null){
                        // 容器中不存在要注入的bean,创建该bean
                        existBean = createBean(beanMap.get(prop.getRef()));
                        // 将创建好的单例bean放入容器中
                        if("singleton".equals(beanMap.get(prop.getRef()).getScope())) {
                            context.put(prop.getRef(), existBean);
                        }
                    }
                    param = existBean;
                }

                try {
                    // 调用set方法注入该属性
                    setMethod.invoke(beanInstance, param);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        return beanInstance;
    }

    /*
     * @Author ARong
     * @Description 通过反射获取到实例的变量setter方法
     * @Date 2020/2/13 2:32 下午
     * @Param [beanInstance, proName]
     * @return java.lang.reflect.Method
     **/
    private Method getSetMethod(Object beanInstance, String proName) {
        Class<?> beanClass = beanInstance.getClass();
        Method setterMathod = null;
        // 先获取方法参数类型
        Class<?> type = null;
        try {
            type = beanClass.getDeclaredField(proName).getType();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        String begin = proName.substring(0, 1).toUpperCase();
        String methodName = "set" + begin + proName.substring(1);
        // 获取setter方法
        try {
            setterMathod  = beanClass.getDeclaredMethod(methodName, type);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return setterMathod;
    }
}
  • test包
    进行简单的IOC测试
  • TestIOC
/**
 * @Auther: ARong
 * @Date: 2020/2/13 1:24 下午
 * @Description: 测试IOC容器
 */
public class TestIoC {
    @Test
    public void testIOC() {
        // 1.初始化IOC容器
        System.out.println("==========1.初始化IOC容器==========");
        XmlApplicationContext context = new XmlApplicationContext("/Users/arong/MyFile/Project/Algorithm/src/main/java/spring_demo/my_ioc/xml/applicationContext.xml");

        // 2.测试注入在Student中注入name属性
        System.out.println("==========2.测试注入在Student中注入name属性==========");
        testGetBean1(context);

        // 3.测试在Person中注入student引用以及name属性
        System.out.println("==========3.测试在Person中注入student引用以及name属性==========");
        testGetBean2(context);

        // 4.测试Person对象是否为多例、Student对象是否为单例
        System.out.println("==========4.测试Person对象是否为多例、Student对象是否为单例==========");
        testGetBean3(context);
    }



    private void testGetBean1(XmlApplicationContext context) {
        Student student = (Student) context.getBean("student");
        System.out.println(student+"\n");
    }

    private void testGetBean2(XmlApplicationContext context) {
        Person person = (Person) context.getBean("person");
        System.out.println(person+"\n");
    }

    private void testGetBean3(XmlApplicationContext context) {
        Student student1 = (Student) context.getBean("student");
        Student student2 = (Student) context.getBean("student");
        System.out.println("student1 == student2:" + (student1 == student2));
        Person person1 = (Person) context.getBean("person");
        Person person2 = (Person) context.getBean("person");
        System.out.println("person1 == person2:"+(person1 == person2));
    }

输出结果显示,IOC基本功能正常,这两百多行代码就是IOC的核心代码了。具体的例如Bean的生命周期如何管理?以及如何配置注解的扫描方式就是更进一步的细化了~
在这里插入图片描述

ioc简单实现 IOC原理的基本实现,使用的是donetcode控制台应用程序,VS2017。比较简单易懂,没有多余代码,可以帮助需要的人理解IOC原理。 立即下载

相关推荐

舵机操作手册

微型伺服马达原理与控制(中鸣) 1、微型伺服马达内部结构一个微型伺服马达内部包括了一个小型直流马达;一组变速齿轮组;一个反馈可调电位器;及一块电子控制板。其中,高速转动的直流马达提供了原始动力,带动变速(减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服马达的输出扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低。 2、微行伺服马达的工作原理一个微型伺服马达是一个典型闭环反馈系统,其原理可由下图表示: 减速齿轮组由马达驱动,其终端(输出端)带动一个线性的比例电位器作位置检测,该电位器把

HEIMENGER的博客 3139

Spring框架--IOC详解+代码简单实例

如果自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,可以使用Qualifier(value=“XX”)去配置@Autowired的使用。IoC(Inversion of Control),是一种设计思想,**DI(依赖注入)**是实现IoC得一种方法。在之前的业务中用户的需求可能会影响原来的代码,我们需要根据用户的需求修改原来的代码,比如在dao层中增加多个实现类。一般用于团队开发,它可以将多个配置文件,导入合并为一个,加入不同类需要不同的bean文件。......

A_Tu_daddy的博客 1636

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

精通Spring AOP和IOC:原理、应用场景与实战代码示例一网打尽!

本文提供了有关如何使用Python网络爬虫和自然语言处理库来抽取网页内容和分析文本数据的信息。作者介绍了如何使用BeautifulSoup和Requests库来爬取网站内容,并使用NLTK库对文本进行分词、词干提取和词性标注等处理。此外,作者还介绍了如何使用Pandas库来处理抓取到的数据,并使用Matplotlib库来可视化数据。这些技术可以帮助数据分析人员从网页中获取有用的信息,进而进行更深入的探索和分析。

qq_28245087的博客 2444

逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

f6g7h8i9j的博客 733

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 246

SPRING高级框架IOC+AOP+项目实战

SPRING高级框架IOC+AOP+项目实战 序曲: 文章内容输出来源:拉勾教育Java高薪训练营; 本篇文章是 第一阶段 模块二:IoC容器设计实现及Spring源码分析 学习课程中的一部分笔记。 本博文详细说明了Spring高级框架的概况、IOC思想及其高级特性、AOP思想及其高级特性、最后以项目实战的方式进行相应的应用。 1、Spring高级框架概况 2、Spring IOC 3、Spring AOP 4、银行转账项目实战 5、知识点总结 写在前进的路上 ...

sahdklasdqwna的博客 452

qt医疗信息系统(HIS)

**UI 组件**: QWidget、QTextBrowser、QTableWidget、QGraphicsView 等。- **网络通信**: Qt Network (TCP/IP)- **DICOM 处理**: DCMTK 3.6.7。- **数据库**: SQLite (轻量、跨平台)**数据库文件**: `hospital.db`- **开发框架**: Qt 6 (C++)- 医疗影像 (DICOM) 查看器。**医疗影像 (DICOM) 查看器****电子病历 (EMR) 浏览器**

寒寒豆豆软件公司的博客 339

彻底学会Spring的IOC和AOP——理论+实操

目录 1 IOC 1.1 概念 1.2 底层原理 1.3 IOC容器 1.4 Bean管理:基于xml配置文件实现 1.5 两种类型的Bean 1.6 Bean的作用域 1.7 Bean的生命周期 1.8 自动装配(xml方式) 1.9 在bean中引入外部配置文件 1.10 Bean管理:基于注解实现 1.10.1 基于注解实现对象的创建 1.10.2 基于注解实现属性注入 1.10.3 完全注解开发实现 2 AOP 2.1 概念 2.2 底层原理 2.3 JDK动态.

来者无穷_ 2015

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 189

YOLO26涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇 | 引入 LFSB 差分双维注意融合模块,通过交替特征融合与分离策略,能够精准区分目标特征,顶会助力YOLO26有效涨点

本文提出LSFB差分双维注意融合模块,用于改进YOLO26目标检测模型。该模块通过融合-分离交替策略和差分注意力机制,有效提升模型在复杂场景下的特征分离能力,特别是在处理重叠物体或反射干扰时表现优异。LSFB采用双向投影、双维注意力计算和跨流减法算子,实现特征共享与独立提取的平衡。实验表明,该模块能显著减少特征混淆,提高检测精度和鲁棒性。文章还详细介绍了模块实现的核心代码、YAML配置文件修改方法以及三种改进方案,为YOLO26模型性能提升提供了创新解决方案。

Ai缝合怪、助力小伙伴高效发论文 326

深入剖析Spring IOC容器——原理、源码与实践全解析

本文深入解析Spring框架的核心设计思想——控制反转(IOC)与依赖注入(DI)。通过源码分析和可视化流程图,详细阐述了IOC容器的架构设计、Bean生命周期管理及其在现代框架中的演进。文章对比了三种依赖注入方式的适用场景,剖析了循环依赖的解决方案,并提供了性能优化建议与最佳实践。作者"励志成为糕手"强调理解IOC对掌握Spring设计哲学的重要性,指出IOC不仅是技术实现,更代表了软件开发范式的转变,能显著提升代码解耦性和可测试性。全文结合Spring 6.x最新源码,为开发者提供了

言不信者行不果,行不敏者言多滞. 2万+

六、Tool 工具系统:让大模型拥有“手脚“

我问你一个问题:大模型能不能告诉你"北京今天天气怎么样"?能——它能用非常流畅的中文回答你不能——它不知道这个答案因为它没有联网能力,也没有实时数据。它可能会自信地编一个"今天晴,25 度"给你——这就是幻觉。问题出在哪?大模型是一个"推理引擎",不是一个"执行引擎"。它知道天气 API 怎么调用,但不能真的发出 HTTP 请求。它知道 Python 代码怎么写,但不能真的运行代码。它知道数学公式,但做不了精确的大数计算。Tool 工具系统解决的,就是这个"最后一公里"问题。

牛肉胡辣汤 160

第 2 章:Spring Framework 中的 IoC 容器

在介绍 Spring Framework 的 IoC 容器前,我们有必要先理解什么是“控制反转”。控制反转是一种决定容器如何装配组件的模式。只要遵循这种模式,按照一定的规则,容器就能将组件组装起来。这里所谓的容器,就是用来创建组件并对它们进行管理的地方。它牵扯到组件该如何定义、组件该何时创建、又该何时销毁、它们互相之间是什么关系等——这些本该在组件内部管理的东西,被从组件中剥离了出来。

Binge毕设 2082

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Framework,ioc容器(转)

Spring Framework,ioc容器(转)Spring Framework,ioc容器(转)October 2003 You may have heard the buzz this summer around the Spring Framework. In this article, I’ll try to explain what Spring sets out to achie

eako的专栏 2277

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring技术内幕——Spring Framework的IOC容器实现(一)

一、SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上。这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成。他可以再解耦代码的同时提高了代码的可测试性。 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中

路漫漫,水迢迢 2209

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Spring Framework的核心:IoC容器的实现(1)

Spring 容器是 Spring 框架的核心。容器将创建对象、将它们连接在一起、配置它们并管理它们从创建到销毁的完整生命周期。Spring 容器使用 DI 管理构成应用程序的组件。这些对象称为 Spring Bean。容器通过读取提供的配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据可以由 XML、Java 注解或 Java 代码表示。下图展示了 Spring 工作原理的高级视图。

鱼干的博客 825

Spring Framework 中的 IoC 容器:实战指南

控制反转是一种软件设计原则,其核心思想是将应用程序的控制权从代码本身分离出来,交给一个外部容器来管理。在传统的编码方式中,对象间的依赖关系通常由对象自身直接创建和管理,这导致了代码之间的紧密耦合。而控制反转则通过将对象的创建和管理委托给容器,实现了对象间的松耦合。控制反转的一个重要实现方式是依赖注入(Dependency Injection)。依赖注入可以通过构造函数、属性或者接口注入的方式,将对象的依赖关系注入到对象中。这种方式极大地提高了代码的灵活性和可测试性。

m0_37643701的博客 766

手写Spring源码——实现一个简单的spring framework

***//*** bean的类型*//*** bean的作用域*//*** 是否懒加载*/在AnnotationConfigApplicationContext中定义一个list保存所有BeanPostProcessor接口。/*** 保存所有BeanPostProcessor接口实现类的集合*/

沐雨橙风ιε的博客 2581

Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

后端小白个人学习记录 1591

Spring Framework :IoC 容器的原理与实践

本文深入探讨了Spring框架中控制反转(IoC)容器的核心机制。文章首先分析了传统Java开发模式在对象管理上的局限性,进而阐述了IoC容器如何通过控制反转和依赖注入(DI)实现组件解耦。详细解析了IoC容器的核心组件(BeanFactory和ApplicationContext)及其三阶段工作流程(资源加载、Bean实例化、初始化)。同时介绍了三种配置方式(XML、注解、Java配置)的实践应用,并探讨了Bean作用域、循环依赖解决方案等进阶内容。最后提出了优先使用注解配置、依赖接口等最佳实践建议,帮助

sengminPark的博客 1356

Spring技术内幕——Spring Framework的IOC容器实现(二)

三、IOC容器的初始化过程 IOC容器的初始化时由前面介绍的refresh方法来启动的,这个方法标志着IOC容器的正式启动。这个启动包括BeanDefinition的Resource定位、载入和注册。下面我们将详细分析这三个实现过程,Spring把这三个过程分开,并使用不同的模块来完成,通过这样的设计让用户更加灵活的这三个过程进行剪裁和扩展,定义出最适合自己的IOC容器的初始化过程。 第一个过程

路漫漫,水迢迢 1595

Spring FrameWork IOC

其中,主要包括:1.支持IOC(控制反转)和AOP(面向切面编程)的容器 2.支持JDBC和ORM的数据访问模块(主要是针对sql) 3.支持声明式事务模块 4.支持基于Servlet的MVC开发 5.基于Reactive的web开发6.集成JMS、Java Mail、JMX及缓存等其他模块所以,java spring可以说是覆盖了整个程序编程的一个框架,

m0_65376383的博客 1005

你真的了解Spring Framework吗?

现在做Java Web开发,想必很少有人不知道Spring Framework。对于初学者来讲可能只接触过其中的一两个模块,对于Spring 平台没有一个整体上的认识,核心概念IoC&DI也是一知半解。本文就与读者来一探究竟,揭开Spring 神秘的面纱。Java 框架   上世纪90年代,使用Java开发Web应用普遍使用J2EE标准,J2EE具有平台无关性,对事务、消息等企业级的特性都有很好

Just do it! 1万+

ioc容器的实现方法有哪些_源码成神之路:Spring Framework源代码解析之IOC容器(二)

在上文(Spring Framework源代码解析之IOC容器(一))中,我们简单了解了Spring的IOC特性,但对Spring相关源码没有做详细的分析,本文将对支持IOC特性的重要代码进行分析,有不对的地方请指正。水桶的标准——BeanFactory 我们说Spring中包含了IOC的容器,倒不如说它包含了一系列容器的集合,因为IOC容器不只一个,像ConfigurableBeanFacto...

weixin_39776991的博客 175

《Java 100 天进阶之路》第73篇:Spring IoC容器(2026版)

Spring全家桶专题开篇之作!IoC(控制反转)是Spring最核心的基石——将对象的创建和依赖管理从代码转移到容器。一文掌握IoC与DI的关系(思想 vs 实现)、BeanFactory vs ApplicationContext(懒加载 vs 预加载)、Bean生命周期五阶段(实例化→属性填充→初始化→使用→销毁)、三种配置方式(XML/注解/Java配置)。附完整代码示例、避坑清单、面试高频考点与追问陷阱。理解了IoC容器,就理解了Spring的"心脏"!

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 8262
上一篇: Netty(7)-构建pipeline、channelHandler、Decoder和Encoder
下一篇: 【吐血整理】LeetCode与剑指Offer百道经典题解总结
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值