美文网首页
spring创建的对象DI原理

spring创建的对象DI原理

作者: 风雪_夜归人 | 来源:发表于2023-11-11 10:49 被阅读0次

DI

就是在对象创建的同时能自动给对象中的属性赋值

看代码

get set方法赋值

  • spring项目,在ApplicationContext.xml中 配置如下
<!--    通过属性对应的set方法做自动DI-->
<!--    通过属性对应的set方法做自动DI-->
    <bean name="student" class="domain.Student">
        <property name="ssex" value="男"></property>
        <property name="sage" value="19"></property>
<!--        value的两种写法-->
        <property name="sid">
            <value>11</value>
        </property>
        <property name="sname">
<!--            value标签中带类型写法-->
            <value type="java.lang.String">zhaoyun1</value>
        </property>
    </bean>
  • 写一个Student实体类,有get set方法、 不带参构造方法;
  • 写一个测试类
    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Student s = (Student) factory.getBean("student");
        System.out.println(s);
    }

运行结果如下

Student{sid=11, sname='zhaoyun1', ssex='男', sage=19}

构造方法赋值

  • spring项目,在ApplicationContext.xml中 配置如下
<!--    通过带参数的构造方法 给属性赋值-->
    <bean name="student" class="domain.Student">
        <constructor-arg name="sid" value="22" type="java.lang.Integer"></constructor-arg>
        <constructor-arg name="sage" value="16" ></constructor-arg>
        <constructor-arg name="sname">
            <null></null>
        </constructor-arg>
        <constructor-arg name="ssex" value="女" type="java.lang.String"></constructor-arg>
    </bean>
  • 写一个Student实体类,有带参构造方法,get set方法不需要;
  • 写一个测试类
    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Student s = (Student) factory.getBean("student");
        System.out.println(s);
    }

运行结果如下

Student{sid=22, sname='null', ssex='女', sage=16}

注意:使用构造方法赋值时,注意字段个数和构造方法参数要匹配,否则会有如下报错


image.png

总结

  • 为什么通过配置文件就能创建对象 且能实现赋值呢,getBean方法到底做了什么?
    1.读取xml文件 获取类信息Student类(配置文件有固定格式,有固定格式解析文件也就好解析了)
    2.通过反射Class c = Class.forName("Student");
    3.Student s = (Student)c.newInstance();
    4.找class中所有私有属性

    Filed[] fs = c.getFields();
        for(fs)
        属性类型 getType
        属性名字 getName
        处理set方法名字 set+大写+属性名后半部分
        Method m = c.getMethod();
        set.invode();
    

//构造方法的方式
1.同上
2.同上
3.找到带参数的构造方法
Constructor con = c.getConstructor(配置决定参数个数,否则匹配不到构造方法);
配置还决定是否能与属性名匹配
反射找到属性 属性类型(所以我在配置文件中,有加类型和不加类型,表面上看加不加都行,如果不加的话底层会通过反射匹配,如果加了节省底层开销)
4.执行构造方法创建对象
con.newInstance(值);

相关文章

  • Spring

    什么是 IOC ,了解 Spring IOC 的原理吗? IOC/DI:控制反转,本质是将原来程序中对象创建、依赖...

  • AOP

    反射 java创建对象的方法(5种): Spring AOP: spring分为:1、IOC/DI 2、AOPA...

  • AOP

    java创建对象的方法(5种): Spring AOP: spring分为: 1、IOC/DI 2、AOP AOP...

  • spring ioc 第一题

    spring ioc简介Spring IOC1)是什么? 控制反转 又名DI(依赖注入)1.创建对象 给对象的属性...

  • Spring_4 属性注入介绍及使用

    IOC 和 DI 区别 IOC : 控制反转,把对象创建交给spring 进行配置。 DI : 依赖注入,向类里面...

  • 终极搞一波

    spring ioc IOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整...

  • Spring2-Spring IoC容器和bean

    Spring IoC容器和bean Spring IoC容器 IoC也称为依赖注入(DI),可以帮我们创建对象 管...

  • Spring学习(二)搞定依赖注入(DI)

    导语: 依赖注入(DI)是Spring的最基本要素,而DI的本质是装配(wiring)。装配就是创建应用对象之间协...

  • Spring 与 IoC(第三讲)

    基于 XML 的 DI 举例:Spring_DI 项目。 注入分类Bean 实例在调用无参构造器创建了空值对象后,...

  • 面试官:讲一下spring的ioc和aop

    IOC ioc:让spring帮我们 创建对象(工厂模式) 并管理对象之间的依赖关系。(DI:依赖注入) ioc可...

网友评论

      本文标题:spring创建的对象DI原理

      本文链接:https://www.haomeiwen.com/subject/muexwdtx.html