IOC:控制反转,对象的创建不再由调用者控制,而是由第三方容器控制
IOC的实现:DI注入
DI依赖注入的方式有三种,下面就通过代码来详细讲解
一、属性注入
要求:1.要有set方法
2.要有默认的构造器
1.先创建一个bean类
package com.gec.bean;
public class Car {
private String brand;
private int speed;
private double price;
public Car() {
super();
}
public Car(String brand, int speed, double price) {
super();
this.brand = brand;
this.speed = speed;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", speed=" + speed + ", price=" + price + "]";
}
}
2.在xml文件中注入属性
<bean id="car" class="com.gec.bean.Car">
<!-- 属性注入,要求:要有默认的构造器,要有setXXX方法 -->
<property name="brand"><value>红旗001</value></property>
<property name="speed"><value>100</value></property>
<property name="price"><value>100 0000.00</value></property>
</bean>
3.在测试类中获取容器并通过id创建bean类的实例
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
Car car=(Car) ctx.getBean("car");
System.out.println(car.toString());
二、构造器注入,构造器注入可以通过类型或索引注入,也可以同时使用,还是以上面的bean类为例
<bean id="car01" class="com.gec.bean.Car">
<!-- 构造器注入:按类型注入 -->
<constructor-arg type="java.lang.String"><value>红旗002</value></constructor-arg>
<constructor-arg type="int"><value>200</value></constructor-arg>
<constructor-arg type="double"><value>200 0000.00</value></constructor-arg>
</bean>
<!-- 构造器注入:按索引注入 -->
<bean id="car02" class="com.gec.bean.Car">
<constructor-arg index="0"><value><![CDATA[红旗003<001>]]></value></constructor-arg>
<constructor-arg index="1"><value>300</value></constructor-arg>
<constructor-arg index="2"><value>300 0000.0</value></constructor-arg>
</bean>
三、工厂方式注入
1.创建上面bean类的工厂
package com.gec.bean;
public class CarFactory {
public Car createCar(){
Car car=new Car();
car.setBrand("bengchi");
car.setSpeed(200);
car.setPrice(2000.00);
return car;
}
public static Car createCar2(){
Car car=new Car();
car.setBrand("baoma");
car.setSpeed(200);
car.setPrice(2000.00);
return car;
}
}
2.在xml文件中分别实现静态工厂方法注入和非静态工厂方法注入
<!-- 非静态工厂注入 -->
<bean id="carFactory" class="com.gec.bean.CarFactory"/>
<bean id="car04" factory-bean="carFactory" factory-method="createCar"/>
<!-- 静态工厂注入 -->
<bean id="car05" class="com.gec.bean.CarFactory" factory-method="createCar2"/>
四、当属性不是一个基本类型的值,而是一个对象时
package com.gec.bean;
public class Boss {
private String name;
private Car car;
public Boss() {
super();
}
public Boss(String name, Car car) {
super();
this.name = name;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Boss [name=" + name + ", car=" + car + "]";
}
}
在xml文件中使用如下配置
<bean id="boss" class="com.gec.bean.Boss">
<property name="name"><value>老王</value></property>
<property name="car"><ref bean="car"></ref></property>
</bean>
五、当注入的对象是集合时
package com.gec.bean;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Person {
private List<String> favorites;
private Set<House> house;
private Map<String,String> jobs;
public List<String> getFavorites() {
return favorites;
}
public void setFavorites(List<String> favorites) {
this.favorites = favorites;
}
public Set<House> getHouse() {
return house;
}
public void setHouse(Set<House> house) {
this.house = house;
}
public Map<String, String> getJobs() {
return jobs;
}
public void setJobs(Map<String, String> jobs) {
this.jobs = jobs;
}
@Override
public String toString() {
return "Person [favorites=" + favorites + ", house=" + house + ", jobs=" + jobs + "]";
}
在xml文件中如下配置
<!-- 注入集合-->
<bean id="person" class="com.gec.bean.Person">
<property name="favorites">
<list>
<value>高尔夫</value>
<value>游泳</value>
<value>钱</value>
</list>
</property>
<property name="house">
<set>
<bean class="com.gec.bean.House"></bean>
<bean class="com.gec.bean.House"></bean>
<bean class="com.gec.bean.House"></bean>
</set>
</property>
<!-- 注入map集合,注意entry标签 -->
<property name="jobs">
<map>
<entry>
<key><value>AM</value></key>
<value>开会</value>
</entry>
<entry>
<key><value>PM</value></key>
<value>开会</value>
</entry>
</map>
</property>
</bean>