控制反转IOC的理解

IoC全称Inversion of Control,直译为控制反转。
传统的应用程序中,控制权在程序本身,程序的控制流程完全由开发者控制,例如:
CartServlet创建了BookService,在创建BookService的过程中,又创建了DataSource组件。这种模式的缺点是,一个组件如果要使用另一个组件,必须先知道如何正确地创建它。
在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。为了能让组件在IoC容器中被“装配”出来,需要某种“注入”机制,例如,BookService自己并不会创建DataSource,而是等待外部通过setDataSource()方法来注入一个DataSource:

  1. public class BookService {
  2. private DataSource dataSource;
  3. public void setDataSource(DataSource dataSource) {
  4. this.dataSource = dataSource;
  5. }
  6. }

不直接new一个DataSource,而是注入一个DataSource,这个小小的改动虽然简单,却带来了一系列好处:

  1. BookService不再关心如何创建DataSource,因此,不必编写读取数据库配置之类的代码;
  2. DataSource实例被注入到BookService,同样也可以注入到UserService,因此,共享一个组件非常简单;
  3. 测试BookService更容易,因为注入的是DataSource,可以使用内存数据库,而不是真实的MySQL配置。

因此,IoC又称为依赖注入(DI:Dependency Injection),它解决了一个最主要的问题:将组件的创建+配置与组件的使用相分离,并且,由IoC容器负责管理组件的生命周期。

创建Ioc容器实例

创建IoC容器实例,然后加载配置文件,让Spring容器为我们创建并装配好配置文件中指定的所有的Bean,

  1. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

获取Bean的方式

  1. // 获取 Bean:
  2. UserService userService = context.getBean(UserService.class);
  3. //正常调用:
  4. User user = userService.log("bob@aaa.com", "password")

ApplicationContext说明

ApplicationContext 是一个接口, 有很多实现类
方式一:
ClassPathXmlApplicationContext 就是其中一个。