一 Spring IOC 简介:
①IOC: 全称 Inversion of Contral 翻译过来就是 "反转控制"
在之前我们使用mybatis的时候, 我们需要从dom --> service -->contraller三个层面一个一个进行书写, 显然各个过程都需要我们进行参加, 书写, 并且我们必须了解这整个过程当中的细节点, 并且掌握
但是~~~
在Spring当中 我们就可以使用 "反转控制" 从而大大简化我们的操作, 反转指的其实是操作对象的反转 ,在之前获取资源的时候, 需要我们本身去将各种资源交给组件, 也就是 主动 的输入, IOC则完全将其颠覆了, 我们变成了坐享其成的 "被动". 改变为容器主动的将资源推送给需要的组件, 开发人员也不需要直到容器是如何进行创建的, 只管接收即可, 提高了开发效率
②DI
DI: Dependency Injection 翻译过来就是依赖注入
DI是IOC的另一种表达方式, DI的理解相比于IOC来说更加简单, 依旧举例我们的三大框架 contraller --> service -->dom
很显然, 在这个过程当中, 我们的contraller是依赖于service进行实现的, 但在DI当中, 我们会用组件预先设定好的一些方法, 比如(getter and setter) 接受来自于容器的注入, 也就是contraller注入到service当中, 我们也就不需要自己手动输入了, 倒反天罡
总的来说, IOC其实就是一种反转控制的思想, DI则是IOC的一种具体的实现, 我们可以通过DI来实现IOC
二 IOC容器在Spring的实现:
IOC这种"反转控制"的思想, 实际上是需要一个IOC容器去实现的, 这个容器也就是IOC思想成功的一个实现
IOC容器当中 , 其管理的组件叫做bean, 那么在创建bean之前, 我们首先需要创建一个IOC的容器, 之后bean才能对其进行管理, 在这里Spring也提供了两种的实现方式
1>容器的两种实现方式
①BeanFactory
这是最基本的容器实现方式, 但是需要注意的一点是, 这种方式仅仅只面向Spring本身, 是不提供给开发人员进行使用的
②ApplicationContext
面向Spring开发人员使用的, 并且是基于BeanFactory进行实现的, 是其子接口, 作为子接口, 自然也提供了更多的方法, 高级特性 如图
2>ApplicationContext的主要实现类
在ApplicationContext当中也有许多的接口, 类, 如图
在最下面的实现类当中, 我们发现两种实现方式
①FileSystemXmlApplicationContext
可以搜索磁盘, 通过对应的系统路径读取XML文件, 从而创建IOC的容器对象
②ClassPathXmlApplicationContext
搜索当前工程下的XML格式的配置文件来创建对应的IOC容器对象
很明显, 第一种方式有一个致命的缺点, 那就是, 如果我们更换使用装置, 电脑之后, 无法保证另外一个电脑上, 对应的磁盘也有相应的XML类型的配置文件, 所以我们一般都是用第二种方式, 从而避免在不同的设备上对应路径当中没有配置文件
三 入门案例:
1>导入依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!-- 引入测试类--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies>
2>书写一个简单的类
3>设置Spring IOC的核心XML配置文件(如图所示)
4>配置bean
在IOC容器准备完成之后, 我们开始配置在XML当中对应的bean
<!--bean标签 将对象交给IOC对象容器进行管理 几个属性: ID 用来作为对象的唯一标识 Class设置BEAN对象所对应的对象 后面需要加上全类名 --> <bean id="helloword" class="com.itguigu.spring.pojo.Helloword"></bean>
5>书写测试类
@Test public void test1(){ // 第一步, 我们需要先获取对应的IOC容器 // 实现BEAN的接口实际上是有两个的, 但是第一个BeanFactory对应的是开发人员所使用的 // 另外的一个ApplicationContext才是我们开发人员应该使用的 // 并且在向上进行转型的时候, 我们需要考虑到, 应当是根据当前程序的路径获取的, 而不是根据磁盘路径获取, // 因为根据磁盘获取的话, 可能会造成换设备, 对应的磁盘上并没有相应的文件 ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml"); //输入唯一标识 Helloword helloword = (Helloword) ioc.getBean("helloword"); // 调用Helloword当中的一些方法 helloword.sayHello(); }
结果:
感谢观看OVER!