IOC(Inversion of Control)控制反转
1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
IOC本质
控制反转,是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IOC的另一种说法。没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。所谓控制反转:获得依赖对象的方式反转了
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
使用Spring来创建对象,在Spring这些都称为Bean
类型 变量名 = new 类型();
Hello hello = new Hello();
<bean id = "hello" class="com.gwq.pojo.Hello">
<property name="str" value="spring"/>
</bean>
此时id = 变量名
class = new的对象
property相当于给对象中的属性设置一个值!
IOC创建对象的方式
1、使用无参构造创建对象,默认!
2、假设我们要使用有参构造创建对象。
1、下标赋值
<!-- 第一种,下标赋值! -->
<bean id = "user" class="com.gwq.pojo.User">
<constructor-arg index="0" value="Java-Spring"/>
</bean>
2、类型
<!-- 第二种方式:通过类型创建,不建议使用! -->
<bean id="user" class="com.gwq.pojo.User">
<constructor-arg type="java.lang.String" value="qj"/>
</bean>
3、参数名
<!-- 第三种,直接通过参数名来设置 -->
<bean id="user" class="com.gwq.pojo.User">
<constructor-arg name="name" value="qj"/>
</bean>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
Spring配置
别名
<!-- 别名,如果添加了别名,我们也可以使用别名获取到这个对象 -->
<alias name="user" alias="userNew"/>
Bean的配置
<!--
id:bean是唯一标识符,也就是相当于我们学的对象名
class:bean对象所对应的全限定名:包名 + 类型
name:也是别名,而且name可以同时取多个别名
-->
<bean id="userT" class="com.kuang.pojo.UserT" name="user2 u2,u3,u4">
<property name="name" value="kaiy"/>
</bean>
import
import一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
假设,现在项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
- 张三
- 李四
- 王五
- applicationContext.xml
<import resource="beans1.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>
使用的时候,直接使用总的配置就可以了