IoC底层原理

简介: IoC底层原理

前沿:

  • 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来降低代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。IoC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GoF中。
  • Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。
    采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。 也就是说把对象创建和对象之间的调用过程,交给了Spring进行管理。

一. 底层主要用到的技术

  • xml解析
  • 工厂模式
  • 反射

现在我们开始讲解:
先看如下代码:

public class Person {
    
    public void eat(){
    
        System.out.println("吃饭!");
    }
}

public class Student {
     
    private Person person = new Person();

    public void eatForStudent(){
     
        person.eat();
        System.out.println("喝牛奶!");
    }
}

在Student类中需要用到Person,此时我们一般的做法是在Student类中new一个Person的对象,然后通过这个对象去调用其方法,但是我们是否想过,如果Person类发生的改变,比如类名发生了改变,类的路径发生了改变,假如说其他类中也创建了Person对象,如果在其他的类中也创建了Person类对象,这个时候就需要大量的改类路径或者名称,很麻烦了,这个时候我们可以用到如下的工厂模式去解决这个问题:

public class PersonFactory {
      
    public static Person getPerson(){
      
        return new Person();
    }
}

public class Student {
       
    private Person person = PersonFactory.getPerson();

    public void eatForStudent(){
       
        person.eat();
        System.out.println("喝牛奶!");
    }
}

然后在Student类中去调用getPerson方法返回Person类对象,把创建对象的过程交给工厂类PersonFactory来做,如果其他类中也都调用PersonFactory类中的getPerson方法来获取Person类对象,那么如果Person的类路径或者类名改变了,也只需要改变一处即可,也就是改变getPerson方法中的类名称或类路径。

在用了工厂模式之还是有一定的耦合度,此时我们就需要我们的IOC原理,把耦合度降低到最低,在这个过程中除了用到工厂模式外,还需要用到xml解析加上反射。

二.IOC原理过程

步骤一:xml配置文件,配置创建的对象

<bean id="person" class="iocprinciple.Person"></bean>

步骤二:创建工厂类(在工厂模式的基础上利用xml解析加上反射来创建Person类的对象)

public class PersonFactory {
          public static Person getPerson() throws Exception {
          //Dom4j xml解析获取类的全路径 String classPath = new ClassPathXmlApplicationContext("bean1.xml").getClassPath("person"); //通过反射得到类的字节码文件 Class clazz = Class.forName(classPath); //调用方法得到对象 Person person = (Person)clazz.newInstance(); return person; } } 

Person类内容不变,Student变为如下:

public class Student {
           private Person person; public void eatForStudent(){
           try {
           person = PersonFactory.getPerson(); } catch (Exception e) {
           e.printStackTrace(); } person.eat(); System.out.println("喝牛奶!"); } } 

用到Dom4j的xml解析类如下:

import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ClassPathXmlApplicationContext {
            private String configFilePath; public ClassPathXmlApplicationContext(String configFilePath) {
            this.configFilePath = configFilePath; } /* * dom4j解析 */ public String getClassPath(String id) throws Exception {
            String classPath = null; // 解析xml SAXReader reader = new SAXReader(); InputStream inputStream = ClassLoader.getSystemResourceAsStream(configFilePath); Document document = reader.read(inputStream); if (document == null) {
            return null; } // 从项目根目录下读取 Element root = document.getRootElement(); // 获取节点资源 List<Element> list = root.elements(); if (list.size() <= 0) {
            return null; } for (Element element : list) {
            String idString = element.attributeValue("id"); if (id.equals(idString)) {
            // 获取bean的class地址 classPath = element.attributeValue("class"); break; } } return classPath; } } 

这就是spring中IoC的底层原理,在之后的使用过程中,我们只需要写好spring的xml配置文件就可以啦,Spring已经为我们写好了这些关于IoC底层的代码。

目录
相关文章
|
6月前
|
Java Spring 容器
【Spring AOP底层实现原理】
【Spring AOP底层实现原理】
|
2天前
|
运维 Java 程序员
Spring5深入浅出篇:AOP底层实现原理
该文档介绍了Spring AOP的底层实现原理,核心问题包括动态代理类的创建。JDK动态代理通过`Proxy.newProxyInstance()`创建接口的实现类,而CGlib则是通过子类继承父类的方式生成代理对象。文中还提供了JDK和CGlib动态代理的代码示例。最后总结,JDK代理基于接口,CGlib则基于继承父类来实现。
|
29天前
|
消息中间件 前端开发 Java
面试官:说说Spring中IoC实现原理?
IoC(控制反转)是种编程思想,旨在降低代码耦合,提高重用性、可测试性和灵活性。Spring通过工厂模式和反射实现IoC,其中依赖注入(DI)是常见实现方式。初始化IoC容器,读取配置文件创建Bean并利用反射加载对象。课后思考涉及工厂模式在Spring源码中的体现及反射核心实现。更多内容见[www.javacn.site](https://www.javacn.site)。
18 1
|
3月前
|
Java Spring 容器
面试题:说说你对依赖注入的理解?
面试题:说说你对依赖注入的理解?
22 0
|
4月前
|
SQL 缓存 Java
【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
29 0
|
9月前
|
XML 图形学 数据格式
IOC控制反转——基础概念与实例
IOC控制反转——基础概念与实例
|
10月前
|
XML 设计模式 Java
【面试必问】Spring核心之控制反转(IOC)
Spring Bean是Spring框架中的一个核心概念,它是一个由Spring容器管理的对象。在Spring中,Bean是指任何一个由Spring容器所管理的对象,可以是Java类的实例、数据源、事务管理器等等
84 1
【面试必问】Spring核心之控制反转(IOC)
|
设计模式 Java 中间件
(一)Spring工厂的底层实现原理(简易版)&理解Spring三大核心思想之一:IOC思想及使用
Spring工厂的底层实现原理(简易版)&理解Spring三大核心思想之一:IOC思想及使用 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:https://blog.csdn.net/weixin_44385486/article/details/121241079
247 0
(一)Spring工厂的底层实现原理(简易版)&理解Spring三大核心思想之一:IOC思想及使用
|
设计模式 数据采集 Java
java设计模式之代理设计模式(Spring核心思想AOP的底层设计模式)
代理设计模式 🍅 作者:程序员小王 🍅 程序员小王的博客:程序员小王的博客 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
94 0
java设计模式之代理设计模式(Spring核心思想AOP的底层设计模式)
|
缓存 安全 Java
AOP底层原理解析
AOP底层原理解析
260 0
AOP底层原理解析