通过简单Spring事例理解SpringIOC思想

版权声明:欢迎转载,若有不当之处请在评论中指出,共同交流。 https://blog.csdn.net/qq_33290787/article/details/53045998

在阅读本文前,应该对Spring有所了解。Introduction to the Spring FrameworkThe IoC container


  1. 首先,IOC与AOP独立于Spring存在,只是Spring给出了IOC与AOP(AOP面向切面通过业务逻辑的分离,如:事务管理,权限控制,日志等,实现内聚开发)的具体实现,这里重点总结IOC。
  2. 在总结IOC前,有必要说说第一个IOC的例子spring-hello:
    这里写图片描述
    接口HelloApi中定义了一个方法叫做sayHello(); HelloImpl中给出了这个接口的实现:
    这里写图片描述
    这里写图片描述
    ApplicationContext.xml配置文件:
    这里写图片描述
    需要导入的jar包:
    这里写图片描述
    HelloTest测试:
    这里写图片描述
    运行结果:
    这里写图片描述
  3. 在测试方法中,并没有像HelloApi helloApi = new HelloImpl()一样new一个对象,而是从容器context中取出一个组件bean直接使用,这个组件的名字叫hello。这样就好像是context这个bean容器帮我们实现了新建对象的过程,新建对象这个控制权不在程序员手上,所以这个过程叫做控制反转,这个context容器叫做SpringIOC容器。
  4. 这个简单例子的操作或许看上去有点多余了,首先要通过加载类路径下的配置文件applicationContext.xml初始化得到一个SpringIOC容器context(在配置文件中给出了id为hello的组件bean的类为bit.HelloImpl的配置,容器context将这个实现好的类加入到容器中以待使用,这个过程叫依赖注入,是控制反转的另一种理解方式),然后指定接口名与bean的id得到可以直接使用的相应对象。其实这个操作比直接new一个对象要复杂,但是为什么还这么做呢?
  5. 在回答上面这个问题时,要说说面向接口编程。为什么要有面向接口编程?接口其实是一个规范,它是用来统一行为的标准。面向对象的一大特性为多态,通过接口的不同实现(implements)去实现多态。举个例子:一个iAnimals的bark()接口,可以是cat叫,可以是dog叫还可以是bull叫,不同的动物叫声肯定不一样,这就对应了bark()接口应该有不同的实现(即多态)。上面提到了从context容器获取组件hello时只需要指定它的接口,因为它的对应实现已经在配置文件中给出配置,在实际编程逻辑中就不需要new impl(),比普通的接口编程少了new的操作。
  6. 少了new impl()有什么好处呢?试想一种情况,在一个类中有3个方法都分别用到了HelloApi,普通的接口编程就是在3个方法中分别HelloApi helloApi = new HelloImpl();若有一天业务逻辑变更要将HelloApi的实现类换成HelloImpl2,这样就要改3个地方,如果这个3是10000呢?就要改10000次。但通过SpringIOC容器,无论是3还是10000,只需要修改配置文件的一处地方,将改成,实际编程逻辑中不需要做任何改动。
  7. 因此,对上面提到的做一个简单总结就是:SpringIOC将配置信息与实际编程逻辑很大程度上做了解耦,提高了开发与维护的效率。

补充说明:

  1. Bean就是由Spring容器初始化、装配和管理的对象。
  2. SpringIOC容器的代表:BeanFactory(beans-config.xml),ApplicationContext(applicationContext.xml)。
  3. Spring采用依赖注入DI(配置文件的书写,bean关系的维护:设值等)来实现IOC
  4. DI:如果class A需要访问class B的信息,则说类A依赖于类B。Spring的IOC容器以依赖注入的方式实现了Bean对象之间关系的维护,由Bean容器负责组装Bean之间的依赖关系(例如dataSource的rel)。
  5. (基于注解模式对Spring的理解)可以把在SpringIOC container自己注入的各个bean看作是平行等级分散的,需要A的时候从容器中装载@Autowired进来不需要new操作直接使用,也不需要关心A它的依赖具体是什么,Spring会基于注解自动扫描自行管理帮助实例化。

猜你喜欢

转载自blog.csdn.net/qq_33290787/article/details/53045998