1.8.1 什么是控制反转
将组件对象的控制权从代码本身转移到外部容器。
组件化的思想:分离关注点,使用接口,不再关注实现。
依赖的注入:将组件的构建和使用分开。
当某个角色(比如一个java实例,调用者)需要另一个角色(另一个java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但是在spring里,创建被调用者的工作不再由调用者来完成。因此被称为控制反转;
创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也称为依赖注入。这样给程序带来很大的灵活性,这样也实现了我们的接口和实现的分离。
简而言之也就是说我们要获得一个对象,不由我们开发者自己创建,而是由我们的容器来注入给我们的程序来使用。
示例:使用Spring实现“控制反转”。
Spring配置文件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-3.2.xsd">
<!-- 通过bean元素声明需要Spring创建的实例。该实例的类型通过class属性指定,并通过id属性为该实例指定一个名称,以便在程序中使用 -->
<bean id="helloSpring" class="cn.springdemo.HelloSpring">
<!-- property元素用来为实例的属性赋值,此处实际是调用setWho()方法实现赋值操作-->
<property name="who">
<!-- 此处将字符串"Spring"赋值给who属性 -->
<value>Spring</value>
</property>
</bean>
</beans>
类HelloSpring.java代码如下
package cn.springdemo;
/**
* 第一个Spring,输出"Hello,Spring!"。
*/
public class HelloSpring {
// 定义who属性,该属性的值将通过Spring框架进行设置
private String who = null;
/**
* 定义打印方法,输出一句完整的问候。
*/
public void print() {
System.out.println("Hello," + this.getWho() + "!");
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
}
测试类HelloSpringTest.java代码如下
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.springdemo.HelloSpring;
public class HelloSpringTest {
@Test
public void helloSpring() {
// 通过ClassPathXmlApplicationContext实例化Spring的上下文
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 通过ApplicationContext的getBean()方法,根据id来获取bean的实例
HelloSpring helloSpring = (HelloSpring) context.getBean("helloSpring");
// 执行print()方法
helloSpring.print();
}
}
输出结果: