一、IOC(Inversion(反转) Of Control):控制反转
控制:资源的获取方式:
(1)主动式:(每次要什么资源,就直接创建即可)
BookServlet{ BookService bs = new BookService(); AirPlane ap = new AirPlane();//复杂对象的创建是比较庞大的工程; }
(2)被动式:资源的获取,不是我们自己创建,而是交给一个容器来创建和设置;
BookServlet{ BookService bs; public void test1(){ bs.checkout();// } }
容器:管理所有的组件(有功能的类);假设,BookServlet受容器管理,BookService也受容器管理;
容器可以自动的探查出哪些组件(类)需要用到另一些组件(类);容器帮我们创建BookService对象,并把BookService对象赋值过去。
从之前的主动的new资源变为被动的接受资源;
(容器)婚介所;从主动获取资源到被动接受
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
二、DI(Dependency Injection):依赖注入
如果IOC是一种思想,那DI就是一种思想实现的一种描述
容器能知道哪个组件(类)运行时,需要另一个组件(类);
上列中,容器通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中
只要是容器管理的组件(类),都能使用容器提供的强大功能;
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
总结: IOC 就是一种反转控制的思想, 而DI是对IOC的一种具体实现。
三、IOC容器在Spring中的实现
前提: Spring中有IOC思想, IOC思想必须基于 IOC容器(ApplicationContext)来完成, 而IOC容器在最底层实质上就是一个对象工厂.
1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。
2)Spring提供了IOC容器的两种实现方式
① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
② ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。
利用反射技术,通过全类名加载文件,使用无参构造方法,创建 Java 对象
四、ApplicationContext的主要实现类
(1) ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件(相对路径)
(2) FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件(绝对路径)
(3)在初始化时就创建单例的bean,也可以通过配置的方式指定创建的Bean是多实例的。
五、ConfigurableApplicationContext
(1)是ApplicationContext的子接口,包含一些扩展方法
(2) refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。
六、WebApplicationContext
专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作
七、容器的结构图