控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中
以上不太懂,不做任何解释
我们来看例子:
- 修改服务器类
public interface MessageService {
String getMessage();
}
- 创建实现类,用于返回值
public class MessageServiceImpl implements MessageService {
private String username;
private int age;
public MessageServiceImpl(String username, int age) {
this.username = username;
this.age = age;
}
public String getMessage(){
return "Hello World!"+ username +",age is"+ age;
}
- 修改打印器
public class MessagePrinter {
final private MessageService service;
public MessagePrinter(MessageService service){
this.service=service;
}
public void printMessage(){
System.out.println(this.service.getMessage());
}
- 修改应用主类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
public static void main(String[] args) {
@SuppressWarnings("resources")
ApplicationContext context =new
ClassPathXmlApplicationContext("beans.xml");
MessagePrinter printer =context.getBean(MessagePrinter.class);
printer.printMessage();
}
- 创建配置文件
<bean id="messageServiceImpl" class="com.spring.spring.ioc.MessageServiceImpl">
<constructor-arg name="username" value="li"></constructor-arg>
<constructor-arg name="age" value="21"></constructor-arg>
</bean>
<bean id="messagePrinter" class="com.spring.spring.ioc.MessagePrinter">
<constructor-arg name="service" ref="messageServiceImpl"></constructor-arg>
</bean>
- 运行结果

依赖注入的详细配置:
- 直接赋值
<property name="" value=""/>
- 引用其他bean
<ref bean="somebean"/>
- 内部bean
- 集合
<list>,<set>,<map>,<props>用于配置集合类型的属性和参数 - null及空字符的值
- xml短域名空间
- 复合属性名称
集合的一个例子
- 定义三个类
public class Car {
private String brand;
private String color;
private String parameter;
public Car(String brand, String color, String parameter) {
this.brand = brand;
this.color = color;
this.parameter = parameter;
}
public Car() {
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", color='" + color + '\'' +
", parameter='" + parameter + '\'' +
'}';
}
import java.util.List;
public class Boss {
private String name;
private String Company;
private Car car;
private List<String> hobbies;
public Boss(String name, String company, Car car, List<String> hobbies) {
this.name = name;
Company = company;
this.car = car;
this.hobbies = hobbies;
}
public Boss() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return Company;
}
public void setCompany(String company) {
Company = company;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
@Override
public String toString() {
return "Boss{" +
"name='" + name + '\'' +
", Company='" + Company + '\'' +
", car=" + car +
", hobbies=" + hobbies +
'}';
}
import java.util.List;
public class Meeting {
private String theme;
private List<Boss> bosses;
public Meeting(String theme, List<Boss> bosses) {
this.theme = theme;
this.bosses = bosses;
}
public Meeting() {
}
public String getTheme() {
return theme;
}
public void setTheme(String theme) {
this.theme = theme;
}
public List<Boss> getBosses() {
return bosses;
}
public void setBosses(List<Boss> bosses) {
this.bosses = bosses;
}
@Override
public String toString() {
return "Meeting{" +
"theme='" + theme + '\'' +
", bosses=" + bosses +
'}';
}
- 配置文件
<bean id="car1" class="com.spring.spring.meeting.Car">
<constructor-arg name="brand" value="小汽车"/>
<constructor-arg name="color" value="黑色"/>
<constructor-arg name="parameter" value="4.0T"/>
</bean>
<bean id="car2" class="com.spring.spring.meeting.Car">
<constructor-arg name="brand" value="公交车"/>
<constructor-arg name="color" value="白色"/>
<constructor-arg name="parameter" value="3.8T"/>
</bean>
<bean id="car3" class="com.spring.spring.meeting.Car">
<property name="brand" value="浅灰"/>
<property name="color" value="灰色"/>
<property name="parameter" value="4.5T"/>
</bean>
<bean id="boss1" class="com.spring.spring.meeting.Boss">
<constructor-arg name="name" value="马云"/>
<constructor-arg name="company" value="阿里巴巴"/>
<constructor-arg name="car" ref="car1"/>
<constructor-arg name="hobbies">
<list>
<value>读书</value>
<value>看新闻</value>
</list>
</constructor-arg>
</bean>
<bean id="boss2" class="com.spring.spring.meeting.Boss">
<property name="name" value="马化腾"/>
<property name="company" value="腾讯"/>
<property name="car" ref="car2"/>
<property name="hobbies">
<list>
<value>打游戏</value>
<value>看电影</value>
</list>
</property>
</bean>
<bean id="boss3" class="com.spring.spring.meeting.Boss">
<property name="name" value="雷军"/>
<property name="company" value="小米"/>
<property name="car" ref="car3"/>
<property name="hobbies">
<list>
<value>阅读</value>
<value>运动</value>
</list>
</property>
</bean>
<bean id="meeting" class="com.spring.spring.meeting.Meeting">
<property name="theme" value="未来"/>
<property name="bosses">
<list>
<ref bean="boss1"/>
<ref bean="boss2"/>
<ref bean="boss3"/>
</list>
</property>
</bean>
- 主类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MeetingApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/beans.xml");
Meeting meeting = context.getBean(Meeting.class);
System.out.println(meeting);
}
-
运行结果
DI.png
网友评论