Spring与IoC系列一:Spring容器

it2022-05-05  138

什么是IOC

控制反转(IOC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。

IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种:依赖注入和依赖查找。依赖注入方式应用更为广泛。依赖注入是目前最优秀的解耦方式。

依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境给组件,程序代码则需要提供具体的查找方式。比较典型的是依赖于JNDI系统的查找。依赖注入:Dependency Injection,DI,程序代码不做定位查询,这些工作由容器自行完成。(Spring采用的就是依赖注入)

什么是Spring容器

我们说Spring解耦合的方式到底是什么呢?就是我们不在自己创建对象,而是由Spring容器来帮助我们创建。我们来创建几个程序看看一个例子。

创建接口和实现这个接口的实体类(为什么要先创建接口再创建实现类呢)

接口:

public interface ISomeService { void doSome(); }

实现类:

public class SomeServiseImpl implements ISomeService { public void doSome() { System.out.println("执行doSome方法"); } }

测试类

package com.lmm.test; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.core.io.ClassPathResource; import com.lmm.service.ISomeService; import com.lmm.service.SomeServiseImpl; /** * @author lmm E-mail:violet_mmhh@163.com * @time 时间:2019年5月10日 * @function 功能: */ public class MyTest { @Test public void test01() { ISomeService service = new SomeServiseImpl(); service.doSome(); } @Test public void test02() { // 创建容器对象 // 会从类路径下查找配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); // 将实现类SomeServiseImpl解耦合,已经看不到SomeServiseImpl这个实现了类 ISomeService service = (ISomeService) ac.getBean("myService"); service.doSome(); } @Test public void test03() { // 创建容器对象 // 会从工程路径下查找配置文件,就是从磁盘上找 // 当前磁盘路径为项目根目录 ApplicationContext ac = new FileSystemXmlApplicationContext( "applicationContext.xml"); // 将实现类SomeServiseImpl解耦合 ISomeService service = (ISomeService) ac.getBean("myService"); service.doSome(); } @Test public void test04() { // 创建BeanFactory容器对象 @SuppressWarnings("deprecation") BeanFactory bf = new XmlBeanFactory(new ClassPathResource( "applicationContext.xml")); // 将实现类SomeServiseImpl解耦合 ISomeService service = (ISomeService) bf.getBean("myService"); service.doSome(); } } test01中的实体类对象是我们自己创建的,所以耦合度较高,不是Spring的方法。test02中的实体类对象是由ApplicationContext容器创建,并从src的类路径下寻找applicationContext.xml路径test03中的实体类对象是由ApplicationContext容器创建,并从磁盘路径(默认路径是项目根目录)下寻找applicationContext.xml路径test04中的实体类对象是由BeanFactory容器,并从src的类路径下寻找applicationContext.xml路径

ApplicationContext与BeanFactory容器都是Spring容器,test02、test03和test04都是由Spring容器创建类对象,达到了解耦合的目的。那ApplicationContext与BeanFactory容器创建的区别是什么呢? 这两上容器对于其中Bean的创建时机不同:

ApplicationContext容器在进行初始化时,会将其中的所有Bean(对象)进行创建

缺点:占用系统资源(内存、CPU等)

优点:响应速度快

BeanFactory容器中的对象,在容器初始化时并不会被创建,而是在真正获取该对象时才被创建

缺点:相对来说,响应速度慢

优点:不多占用系统资源

一般来说,现在物理内存对我们影响不是很大,所以一般我们都用ApplicationContext容器来创建对象!

 


最新回复(0)