Spring (三) bean ref,IOC和DI粗略理解(构造方法注入)

项目结构
在这里插入图片描述

代码

car

public class Car {

    private String name;
    private Double price;

    public Car() {
        System.out.println("Car无参构造函数");
    }

    public Car(String name, Double price) {
        this.name = name;
        this.price = price;
        System.out.println("Car有参构造函数:name=" + name + "   price=" + price);
    }

    get,set,toString函数
}

Car

public class People {

    private String name;
    // 注意为Integer
    private Integer age;
    private Car car;

    public People() {
        System.out.println("People无参构造函数");
    }

    public People(String name, Integer age) {
        this.name = name;
        this.age = age;
        System.out.println("People二参构造函数:name=" + name + "   age=" + age);
    }

    public People(String name, Integer age, Car car) {
        this.name = name;
        this.age = age;
        this.car = car;
        System.out.println("People三参构造函数:name=" + name + "   age=" + age + "   Car=" + car);
    }

    get,set,toString函数
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="people" class="entity.People" ></bean>
    <bean id="car" class="entity.Car" ></bean>


    <bean id="car2" class="entity.Car" >
        <constructor-arg name="name" value="carn2"></constructor-arg>
        <constructor-arg name="price" value="22.22"></constructor-arg>
    </bean>
    <bean id="car3" class="entity.Car"  scope="prototype">
        <constructor-arg index="0" type="java.lang.String" value="car3"></constructor-arg>
        <constructor-arg index="1" type="java.lang.Double" value="33.33"></constructor-arg>
    </bean>

    <bean id="people2" class="entity.People" >
        <constructor-arg name="name" value="jack"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="car" ref="car2"></constructor-arg>
    </bean>

    <!-- 注意People的age要为Integer -->
    <bean id="people3" class="entity.People" scope="prototype">
        <constructor-arg index="0" type="java.lang.String" value="Tom"></constructor-arg>
        <constructor-arg index="1" type="java.lang.Integer" value="20"></constructor-arg>
        <constructor-arg index="2" type="entity.Car" ref="car3"></constructor-arg>
    </bean>

</beans>

Test

import entity.Car;
import entity.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        test.test1();
    }


    /**
     * car 调用无产构造函数 name=null,price=null ---单例
     * car2 name=car2,price=22.22 ---单例
     * car3 name=car3,price=33.33 ---多例
     * peopel 调用无产构造函数 name=null,age=null,car=null ---单例
     * people2 name=jack,age=18,car=car2 ---单例
     * people3 name=Tom,age=20,car=car3 ---多例
     *
     * <bean id="people" class="entity.People" ></bean>
     * <bean id="car" class="entity.Car" ></bean>
     * <bean id="car2" class="entity.Car"  scope="prototype" >
     *     <constructor-arg name="name" value="carn2"></constructor-arg>
     *     <constructor-arg name="price" value="22.22"></constructor-arg>
     * </bean>
     * <bean id="car3" class="entity.Car" >
     *     <constructor-arg name="name" value="carn3"></constructor-arg>
     *     <constructor-arg name="price" value="33.33"></constructor-arg>
     * </bean>
     * <bean id="people2" class="entity.People" >
     *     <constructor-arg name="name" value="jack"></constructor-arg>
     *     <constructor-arg name="age" value="18"></constructor-arg>
     *     <constructor-arg name="car" ref="car2"></constructor-arg>
     * </bean>
     * <bean id="people3" class="entity.People" scope="prototype" >
     *     <constructor-arg name="name" value="Tom"></constructor-arg>
     *     <constructor-arg name="age" value="20"></constructor-arg>
     *     <constructor-arg name="car" ref="car3"></constructor-arg>
     * </bean>
     */
    public void test1() {
        System.out.println("在加载xml文件时已经单例bean的对象new出来了");
        String xmlPath = "applicationContext.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        System.out.println("-------------------------------------");

        System.out.println("---------car:---------");
        Car car = (Car) applicationContext.getBean("car", Car.class);
        System.out.println(car);

        System.out.println("---------car2:---------");
        Car car2 = (Car) applicationContext.getBean("car2", Car.class);
        System.out.println(car2);

        System.out.println("---------car3:---------");
        Car car3 = (Car) applicationContext.getBean("car3", Car.class);
        System.out.println(car3);

        System.out.println("---------people:---------");
        People people = (People) applicationContext.getBean("people", People.class);
        System.out.println(people);

        System.out.println("---------people2:---------");
        People people2 = (People) applicationContext.getBean("people2", People.class);
        System.out.println(people2);

        System.out.println("---------people3:---------");
        People people3 = (People) applicationContext.getBean("people3", People.class);
        System.out.println(people3);
        System.out.println("-------------------------------------");

        System.out.println("判断car2和people2的car是否为同一个对象");
        System.out.println(people2.getCar().equals(car2));

        System.out.println("判断car3和people3的car是否为同一个对象");
        System.out.println(people3.getCar().equals(car3));

    }

}

结果输出

在加载xml文件时已经单例bean的对象new出来了
People无参构造函数
Car无参构造函数
Car有参构造函数:name=carn2   price=22.22
People三参构造函数:name=jack   age=18   Car=Car{name='carn2', price=22.22}
-------------------------------------
---------car:---------
Car{name='null', price=null}
---------car2:---------
Car{name='carn2', price=22.22}
---------car3:---------
Car有参构造函数:name=car3   price=33.33
Car{name='car3', price=33.33}
---------people:---------
People{name='null', age=null, car=null}
---------people2:---------
People{name='jack', age=18, car=Car{name='carn2', price=22.22}}
---------people3:---------
Car有参构造函数:name=car3   price=33.33
People三参构造函数:name=Tom   age=20   Car=Car{name='car3', price=33.33}
People{name='Tom', age=20, car=Car{name='car3', price=33.33}}
-------------------------------------
判断car2和people2的car是否为同一个对象
true
判断car3和people3的car是否为同一个对象
false

IOC和DI粗略理解

IOC:控制反转
https://www.jianshu.com/p/ad05cfe7868e
可以看到在获取people3对象时,因为People有Car属性,而people3的Car属性对应的是car3,所以在new people3时会先new car3再new people3。这个过程由spring执行不需要自己去new car3,再new people3(单例也为这个顺序为方便说明用多例来说明),即为IOC,控制反转
DI:依赖注入
https://zhuanlan.zhihu.com/p/48058476
people3 的car3 会自动注入people中,不需要手动去people3.setCar(car3),即为依赖注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值