栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

源码 - Spring IOC 概念和底层原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

源码 - Spring IOC 概念和底层原理

文章目录
    • 1. 通过反射创建对象
    • 2. 工厂模式定义
    • 3. IOC底层原理简述

1. 通过反射创建对象

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

java.lang.reflect 包下的反射 API:

  • Class类:代表一个类,位于 java.lang 包下
  • Field类:代表类的成员变量
  • Method类:代表类的方法
  • Constructor类:代表类的构造方法

使用Class类的 forName(String clazzName) 静态方法可以获取Class对象。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名。

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class class = Class.forName("com.example.redislock.reflect.Person");
    }
}

一旦获得了某个类所对应的Class对象之后,程序就可以调用Class对象的方法来获得该对象和该类的真实信息。Class类提供了大量的实例方法来获取该Class对象所对应类的详细信息。

Class对象可以获得该类里的方法(由Method对象表示)、构造器(由Constructor对象表示)、Field(由 Field 对象表示),这 3个类都位于java.lang.reflect 包下。程序可以通过Method 对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建实例,能通过Field对象直接访问并修改对象的属性值。

class Solution {
    public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
        // Class类对象
        Class personClass = Class.forName("com.example.redislock.reflect.Person");
        // 构造方法,Constructor类
        Constructor constructor = personClass.getConstructor(String.class, Integer.class);
        // 方法,Method类
        Method method = personClass.getMethod("toString", String.class);
        // 属性,Field类
        Field field = personClass.getField("name");
    }
}
2. 工厂模式定义

工厂方法模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

在工厂方法模式中:

  • 抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;

  • Creator为抽象创建类,也就是抽象工厂;

  • 具体如何创建产品类是由具体的实现工厂ConcreteCreator完成;

抽象产品类Product负责定义产品的共性 :

public abstract class Procuct {
    // 抽象方法,子类实现
    public abstract void method1();
    // 公共方法
    public void method2(){

    }
}

具体要创建的产品类:

public class ConcreteProduct2 extends Product {
    @Override
    public void method2() {

    }
}

public class ConcreteProduct2 extends Procuct{
    @Override
    public void method1() {

    }
}

抽象工厂类:

public abstract class Creator {
    
    public abstract  T createProduct(Class c);
}

抽象工厂实现类,用于创建具体的Product类:

public class ConcreteCreator extends Creator{
    @Override
    public  T createProduct(Class t) {
        Procuct procuct = null;
        // 类名.class.getName()的作用是获取这个类的全类名
        try {
            procuct =(Procuct) Class.forName(t.getName()).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) procuct;
    }
}
public class Main {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        ConcreteProduct product = creator.createProduct(ConcreteProduct.class);
    }
}

类名.class.getName()的作用:

public class Main {
    public static void main(String[] args) {
        // 输出:com.example.test6.ConcreteProduct
        System.out.println(ConcreteProduct.class.getName());
    }
}

简单工厂模式:一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法就可以了。

public class ConcreteCreator{
    public static  T createProduct(Class t) {
        Procuct procuct = null;
        // 类名.class.getName()的作用是获取这个类的全类名
        try {
            procuct =(Procuct) Class.forName(t.getName()).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) procuct;
    }
}
public class Main {
    public static void main(String[] args) {
        ConcreteProduct product = ConcreteCreator.createProduct(ConcreteProduct.class);
    }
}
3. IOC底层原理简述

什么是 IOC:

(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理;
(2)使用 IOC 目的:为了耦合度降低;

IOC 底层原理涉及技术:xml 解析、工厂模式、反射

① 在bean.xml文件中配置要创建的对象


② 工厂模式创建对象

class UserFactory{
	public static UserDao getUserDao(){
        // 第一步:解析XML文件,获取class类的全类名,
        String clazzName = "com.chahua.spring.User";
        // 第二步:通过反射创建对象
        Class clazz = Class.forName(clazzName);
        UserDao userDao = (UserDao)clazz.newInstance();
        return userDao;
    }
}

Spring 提供 IOC 容器实现两种方式:

(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用。加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象。

(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。加载配置文件时候就会把在配置文件对象进行创建。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号