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

本文通过一个简单的Spring示例介绍了IOC(控制反转)的概念。在Spring中,IOC通过依赖注入实现,允许开发者将对象的创建和管理交给Spring容器,从而实现代码解耦和维护效率的提升。在示例中,接口HelloApi的实现类HelloImpl通过ApplicationContext.xml配置文件被Spring容器管理,测试类HelloTest从中获取并使用组件,而不是直接通过new操作创建对象。这种方式在面对大量依赖时,只需更改配置文件即可调整对象关系,无需修改大量代码。
摘要由CSDN通过智能技术生成

在阅读本文前,应该对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会基于注解自动扫描自行管理帮助实例化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值