6. 控制反转
前边的模板方法的回调,就是一种控制反转的应用
import java.sql.ResultSet;
public class SimpleJdbcQueryTemplate {
public <T> T query(String queryString , ResultSetHandler<T> rsHandler){
//回调
return rsHandler.handle(rs);
}
}
return rsHandler.handle(rs);这条语句决定了控制逻辑,可以动态的改变rsHandler对象,不同的ResultSetHandler的实现类的方法也可能不同,所以这样根据query方法接受的ResultSetHandler对象来决定handle方法究竟执行什么内容。这就是一种控制反转。
我们经常把控制逻辑写在其他地方例如Framwork而非客户化的代码里,这样就可以更专注地于客户化的逻辑,也就是说,外部逻辑负责调用客户化的逻辑,这样就可以更专注于客户化的逻辑。在软件领域中,我们给他取了一个名字叫控制反转(IoC)。
我理解的控制反转就是把对对象的创建及对象的属性和方法的内容的控制抽离出来,不让控制逻辑出现在对象内部,让控制权回到程序员的手里。比如Spring 用xml控制对象的属性。
框架如果没有实现IoC,那么就是一个工具库。使用工具库,必须得撰写调用它们的逻辑,每次调用它们都会完成相应的工作,并把控制权返回给调用者,而框架不需要客户程序撰写控制程序的调用逻辑,由框架专门负责。
依赖注入
依赖注入是实现控制反转的方法。
拿Spring的xml的方式注入举例,这个是配置连接数据库的配置文件。
这干了啥,是不是把DriverManagerDataSource对象所需要的成员变量配置了?这就是依赖注入,说白了就是从DriverManagerDataSource外面,给他赋值。
<beans>
<!-- picks up and registers AppConfig as a bean definition -->
<context:component-scan base-package="com.acme"/>
<context:property-placeholder location="classpath:/com/acme/jdbc.properties"/>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
Spring主要有三种注入,构造器注入,setter注入,注解注入。
实际上依赖注入不止这些比如:接口注入