SpringIOC思想与DI
①获取资源的传统方式
自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,
在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,
同时降低了开发效率。
比如我们在Servlet中自己创建Service对象:
private BookService bookService = new BookServiceImpl();
虽然创建BookServiceImpl对象不难,但是此时得到的仅仅是一个BookServiceImpl对象而已;
如果我们需要附加事务功能,那就必须自己编写代码,执行事务操作:
// 获取数据库连接
Connection conn = ...
try{
// 关闭事务自动提交
conn.setAutoCommit(false);
// 执行核心操作
chain.doFilter(req,resp);
// 提交事务
conn.commit();
}catch(Exception e){
// 回滚事务
conn.rollBack();
}finally{
// 释放数据库连接
conn.close();
}
②反转控制方式获取资源
点外卖:下单、等、吃,省时省力,不必关心资源创建过程的所有细节。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:
反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,
开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,
极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
使用IOC容器后,同样是给BookService属性赋值:
我们只需要声明要什么类型,Spring会自动将我们所需类型的对象注入到这个属性中,
而且是已经附加事务操作的、被增强了的BookService对象。
对象的创建和事务的增强都与业务功能的开发过程无关,确实能够大大简化业务代码的编写。
所以使用框架就是为了让程序员能够尽可能专注于业务的开发,而不必为重复性的操作分散精力。
再举个例子:
我们只需要声明一下,让Spring知道我们需要bookMapper,那么这个对象就自动注入进来;
省略了如下操作:
-
创建SqlSessionFactoryBean
-
获取SqlSession对象
-
调用SqlSession对象的getMapper()方法获取BookMapper对象
当然,我们也必须承认:要实现上面的效果,我们需要搭建环境。
所谓搭建环境主要就是在配置文件中做必要的配置。
就算是我们家里买一个全自动洗衣机,也需要对接220V电压插头、
自来水管、下水管。这其实就是一个给框架搭建环境的过程。
DI
DI:Dependency Injection,翻译过来是依赖注入。
DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)
接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
所以结论是:IOC 就是一种反转控制的思想, 而 DI 是对 IOC 的一种具体实现。
起初是把DI看做是IOC的实现来对待,IOC作为一种思想或标准;
后来发现基本上IOC只有DI这一种实现方式,所以后来也不做严格区分了,
现在我们可以认为IOC和DI是等同的。
什么叫依赖注入:为我们当前spring所管理的对象的属性进行赋值。
浙公网安备 33010602011771号