今天我们主要讲解一下Spring中的比较重要的一个模块——IOC。
1、IOC是什么?
IOC(Inversion of Control)也叫控制反转,是一种编程思维,而不是技术实现。IOC指的就是控制权的反转,用原来手动创建对象,转成java程序创建对象。
- 传统的开发方式:类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
- 使用IOC思维的开发方式:不通过 new 关键字来创建对象,而是通过IOC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从IOC 容器里面过去即可。
从两种不同的开发方式对比来说:我们去创建、管理对象了,只需要修改容器。总结来说:对象是由Spring创建,管理,装配!
我们分别解析一下控制反转的意思:
- 控制:指的是对象创建(实例化、管理)的权力。这个权利从程序本身变为了Sping。
- 反转·:指的是控制权。程序本身不创建对象,而变成被动的接收spring创建的对象。
2、IOC容器
- IOC容器是Spring实现IOC的载体, IOC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
- 想要使用IOC容器,首先要配置Bean,然后实例化容器。最主要的就是配置Bean,下面我们将具体讲解Bean的配置。
2.1、配置Bean
Bean是告诉 Spring 容器实例化、配置和组装应用程序中的对象。 是放在xml文件中的,如何配置Bean:
-
创建应用程序上下文:因为Bean是存放在XML文件中的,所以第一步就是创建XML。在资源文件夹中创建一个XML文件,文件命名可以自定义,并且需要将此XML文件设置为应用程序上下文,设置方式如下:
-
配置Bean:通过
<bean>
标签配置Bean,如下所示
在配置过程中需要给<bean>
标签添加一些属性:id
属性:bean的唯一标识符,也就是相当于我们学的对象名class
属性:bean 对象所对应的全限定名:包名+类型name
属性:别名,而且同时name可以同时取多个别名,用逗号 ( ,)、分号 ( ; ) 或空格分隔lazy-init
属性:是将 bean 定义标记为延迟初始化来防止单例 bean 的预实例化,它有三个值——ture(确定延迟)、false(预先实例化)和default(默认)。scope
属性:详解见下Bean的作用域。init-method
属性:指定类中的初始化方法名称,在bean被实例化之后里面执行。destroy-method
属性:指定类中的销毁方法名称,在bean被销毁之后里面执行。
有关别名的补充,在XML中除了使用<Bean>
标签上的name属性取别名,可以使用<alias>
标签,具体使用方法如下:
上述图片中,我们使用name
属性和<alias>
标签对Bean取别名,在使用过程中我们可以使用user、user1、user2和user3四种名称。
在团队开发中,可能有多个人负责不同的开发,不同的类注册需要在不同的bean中,而在项目整合时需要进行整合。而在Spring中提供了一种整合Bean的方法,使用 <import>
标签进行整合,使用方法如下:
2.2、对Bean进行依赖注入
在类中我们会有一些属性,而通过Bean实例化对象时,也属性给这些属性赋值。依赖注入有两种方式,具体方式入戏:
<property>
标签:使用这种标签是用set
方法完成注入,既在类中通过set
方法完成属性赋值,使用方法如下:
<bean id="..." class="...">
<!--第一种,普通的value注入 String类型-->
<property name="name" value="张三"/>
<!--第二种,引用类型注入 类-->
<property name="address" ref="address"/>
<!--第三种,数组注入-->
<property name="books">
<array>
<value>Spring</value>
</array>
</property>
<!--第四种,list注入 List类型-->
<property name="hobbys">
<list>
<value>java</value>
<value>vue</value>
</list>
</property>
<!--第五种,Map注入 Map类型-->
<property name="card">
<map>
<entry key="id" value="0001"/>
</map>
</property>
<!--第六种,set注入 Set类型-->
<property name="games">
<set>
<value>springboot</value>
</set>
</property>
<!--第七种,空值注入 String类型-->
<property name="wife">
<null/>
</property>
<!--第八种,properties注入-->
<property name="info">
<props>
<prop key="name">王五</prop>
</props>
</property>
<bean/>
<constructor-arg>
标签:使用这种标签是通过有参构造的方式完成注入,既在类中通过有参构造完成属性赋值,使用方法如下:
<bean id="..." class="...">
<!--下标赋值 -->
<constructor-arg index="0" value="张三"/>
<!--类型赋值(不建议使用) -->
<constructor-arg type="java.lang.String" value="张三"/>
<!--通过参数名来赋值 -->
<constructor-arg name="name" value="张三"/>
</bean>
- 简化上面两种方式:既通过p命名空间和c命名空间完成,p标签注入和c标签注入需要在约束条件中加入一条约束代码,分别是xmlns:p=“http://www.springframework.org/schema/p” 和xmlns:c=“http://www.springframework.org/schema/c”。这两种命名空间只是简化了上面提到了两种标签。使用方法如下:
<!--源代码-->
<bean id="..." class="...">
<property name="name" value="张三"/>
</bean>
<!--通过p命名注入,可以直接注入属性的值:properties-->
<bean id="..." class="..." p:name="张三" p:age="18"/>
<!--通过c命名注入,通过构造器注入:construct-args-->
<bean id="..." class="..." c:name="盾山" c:age="19"/>
2.3、 Bean的作用域(sorce)
Bean的作用域(sorce)有singleton、prototype、request、session和application五种取值。其代表含义为:
singleton
:在spring IOC容器仅存在一个Bean实例,Bean以单例方式存在。是bean作用域范围的默认值,这个仅存的Bean实例创建时机为xml被加载的时候。prototype
:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,既创建时机为调用getBean
方法实例化时。- request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
- session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
- application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。
2.4、 IOC容器的使用
在配置完Bean之后,我们就要进行使用,其实使用方法很简单,只需要实例化IOC容器就行。而org.springframework.context.ApplicationContext
接口代表了IOC容器。而实例化通常使用ClassPathXmlApplicationContext
进行。实例化完成之后,使用getBean("名称")
方法就行获取具体的Bean。具体代码如下
//获取带IOC容器,"services.xml", "daos.xml"为参数表示xml文件的地址,可以设置多个
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//我们的对象现在都在Spring中管理了,我们要使用,直接去里面取出来即可,hello为需要创建的对象所在的类名,
Hello hello = (Hello) context.getBean("hello");
//或者使用
//Hello hello = context.getBean("hello",Hello.Class);
2.5、Bean实例化
Bean的实例化是通过IOC完成的,那么IOC到底是怎么实例化的呢。有三种方法:
- 构造函数实例化:IOC默认是使用这种方式就行的,通过无参构造完成。
- 静态工厂方法实例化
- 实例工厂方法实例化
实例化了解一下就可以,知道有三种方式就行。最只要的还是第一种,其他两种不做讲解。
本篇结束,这只是IOC容器的一部分知识,详情见Spring官网!如有错误请及时私信作者!