控制反转IOC的理解
IoC全称Inversion of Control,直译为控制反转。
传统的应用程序中,控制权在程序本身,程序的控制流程完全由开发者控制,例如:
CartServlet创建了BookService,在创建BookService的过程中,又创建了DataSource组件。这种模式的缺点是,一个组件如果要使用另一个组件,必须先知道如何正确地创建它。
在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。为了能让组件在IoC容器中被“装配”出来,需要某种“注入”机制,例如,BookService自己并不会创建DataSource,而是等待外部通过setDataSource()方法来注入一个DataSource:
public class BookService {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
不直接new一个DataSource,而是注入一个DataSource,这个小小的改动虽然简单,却带来了一系列好处:
- BookService不再关心如何创建DataSource,因此,不必编写读取数据库配置之类的代码;
- DataSource实例被注入到BookService,同样也可以注入到UserService,因此,共享一个组件非常简单;
- 测试BookService更容易,因为注入的是DataSource,可以使用内存数据库,而不是真实的MySQL配置。
因此,IoC又称为依赖注入(DI:Dependency Injection),它解决了一个最主要的问题:将组件的创建+配置与组件的使用相分离,并且,由IoC容器负责管理组件的生命周期。
创建Ioc容器实例
创建IoC容器实例,然后加载配置文件,让Spring容器为我们创建并装配好配置文件中指定的所有的Bean,
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
获取Bean的方式
// 获取 Bean:
UserService userService = context.getBean(UserService.class);
//正常调用:
User user = userService.log("bob@aaa.com", "password")
ApplicationContext说明
ApplicationContext 是一个接口, 有很多实现类
方式一:ClassPathXmlApplicationContext
就是其中一个。