项目结构
代码
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),即为依赖注入