Spring系列之IOC

18 篇文章 2 订阅
14 篇文章 0 订阅
    【回顾】
    通过前两篇博客,我们对Spring框架的理论和应用都有了一定的了解,也知道了Spring的核心是IOC,本篇博客将对IOC作进一步的学习。
    Spring帮助我们更简单地实现功能,在于它的使用,可以让我们不必自己去创建所需要的对象实例,它包揽了此项工作,给我们提供了一个容器。我们只需要把东西放进去就好。
    【问题】
    IOC(Inversion of Control),控制反转。 它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
    这样的概念即使是用文字表达出来,也是觉得很抽象的。从网上的一篇文章里,看到了关于理解此概念提出的几个问题,很简单,但如果对此概念不清楚,答案自然就不能脱口而出了。
    1.控制反转:谁控制谁?控制什么?为什么叫反转?
    2.依赖注入和控制反转是一个概念吗?
    3.依赖:谁依赖谁?为什么需要依赖?
    4.注入:谁注入谁?注入的是什么?
    5.参与者都有谁?
    大家心里都有答案了么?其实,在回答前四个问题之前,我们必须清楚第5个问题的答案。整个事件参与者都有谁?
    【解答】
    问题5: 参与者都有谁?
    回想之前的代码,要实现打印结果到控制台,并不是某个对象可以自己直接做到的,它需要调用其它对象。并且使用Spring,不再是自己去调用,而是借助容器。这样一来,问题的答案就有了,下面用专业的术语表达:
     一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。
    某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。
     参与者都知道了,下面知道了整个事件中参与者在何时扮演着怎样的角色,第1-4个问题的答案也就清楚了。
    问题1:谁控制谁?控制什么?为什么叫反转?
    当然是容器去控制对象了,控制的是对象的创建。因为在未使用Spring之前,我们都需要自己主动地去创建其它具体的对象,现在我们不必做这项工作了,交给了容器,它的主动,我们只需要被动等待,也就成了反转了。
    问题2:依赖注入和控制反转是同一个概念么?
    这里又涉及到了另一个名词,“依赖注入”,即DI。在前面的文章中,也多次提到了。其实,实现控制反转的实现方式就是将对象注入,从而有了此概念。可以说,它们是同一个概念,只是描述的角度不同。
    “依赖注入”,从应用程序的角度出发,应用程序需要依赖容器,注入对象,实现创建。
    “控制反转”,从容器的角度出发,容器反向控制应用程序对象的创建。
    问题3: 依赖:谁依赖谁?为什么需要依赖?
    问题2明白了,问题3的答案自然也就有了。应用程序依赖容器,因为应用程序需要容器提供的对象所需要的资源。
    问题4: 注入:谁注入谁?注入的是什么?
    将对象注入到容器中,注入的是对象所需要的外部资源。
    【比较】
    以上问题清楚了,可以说Spring的核心内容也就掌握了。下面扩展一个问题,依赖注入的方式,包括 构造函数注入和Set注入,下面是两者的代码实现:
public class UserManagerImpl implements UserManager { 
    //  构造函数注入方式 
    private UserDao userDao; 
    public UserManagerImpl(UserDao userDao) {
        this.userDao = userDao;
    }
}
//  对应的配置文件写法 
  <bean id="userDao4Mysql" class="com.bjpowernode.spring.dao.UserDao4MySqlImpl"/>
  <bean id="usrDao4Oracle" class="com.bjpowernode.spring.dao.UserDao4OracleImpl"/> 
  <bean id="userManager" class="com.bjpowernode.spring.manager.UserManagerImpl">    
       <constructor-arg ref="userDao4Mysql"/>   
       <constructor-arg ref="usrDao4Oracle"/> 
  </bean>  
public class UserManagerImpl implements UserManager {   
    private UserDao userDao;
    //Set注入方式
    public void addUser(String username, String password) {
        userDao.addUser(username, password);
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
//  对应的配置文件写法 
  <bean id="userDao4Mysql" class="com.bjpowernode.spring.dao.UserDao4MySqlImpl"/>
  <bean id="usrDao4Oracle" class="com.bjpowernode.spring.dao.UserDao4OracleImpl"/> 
  <bean id="userManager" class="com.bjpowernode.spring.manager.UserManagerImpl">    
     <property name="userDao" ref="usrDao4Oracle"/>
    <property name="userDao" ref="userDao4Mysql"/>  
  </bean>
使用何种注入方式?
    构造注入可以在构建对象的同时完成依赖关系的建立,对象一建立则所有的一切都准备好了。但如果对象关系很多,使用构造注入会留下一长串参数,不便记忆。这时使用Set注入会是不错的选择。
    使用Set注入可以有明确的名称,可以了解注入的对象会是什么。由于Set注入提供了Set方法,所以不能保证相关数据或资源在执行时不会被更改,如果开发人员想要让一些数据成员是只读或私有,使用构造注入就更简单了。    
    【总结】
     多动手去利用代码实现,哪怕是照着一个个例子去敲。将接触到的理论和自己敲过的代码去联系,便会产生不一样的共鸣。
     通过这些天对Spring框架的深入学习,对其核心IOC有了自己的理解,不再是架空的感觉。
     以前每次听别人提起IOC,都会说到“容器”,自己并不理解为什么,然后形成了条件反射,每次都是说IOC容器。
    IOC知道了, 但容器是什么?Spring中谁承担着容器的角色?这便是下面的博客需要解决的问题。
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值