2.1 概念
IoC Inversion of Control :控制反转,是一个理论,一个指导思想。指导开发人员如何使用对象去管理对象。把对象的创建、属性赋值、对象的生命周期都交给代码之外的容器管理。(应该用容器来管理对象)。
1)IoC分为:控制和反转
- 控制:对象创建、属性赋值、对象生命周期的管理。
- 反转:
正转:开发人员在代码中,使用new构造方法创建对象,开发人员掌握了对象的创建、属性赋值、对象从开始到销毁的全部过程,开发人员对对象全部控制。、
反转:把开发人员管理对象的权限转移给了代码之外的容器来实现,由容器来完成对对象的管理。
通过容器可以使用容器中的对象(容器已经创建了对象,对象属性赋值了,对象也组装好了)。spring就是一个容器,可以管理对象、创建对象,给属性赋值。
2)IoC的技术实现
DI(依赖注入):dependency indjection,是IoC的一种技术实现。程序只需要提供要使用的对象的名称就可以了,对象如果创建、如何从容器中查找、获取都由容器内部自己实现。
3)Spring 框架使用的DI实现IoC
通过spring框架,只需要提供要使用的对象的名称就可以了。从容器中获取名称对应的对象。Spring的底层是使用的反射机制,通过反射创建对象、给属性赋值。
2.2 Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
spring的标准配置文件:
1)根标签是beans
2)beans后边的是约束文件说明
- xmlns:命名空间,后边的是命名空间的值
- xmlns:xsi:什么xsi这个命名空间
- xsi:schemaLocation,xsi有一个标签叫做 schemaLocation,指定约束文件的具体路径
http://www.springframework.org/schema/beans(简称) http://www.springframework.org/schema/beans/spring-beans.xsd(地址)
3)beans里边是beans的声明
4)什么是bean:由Spring容器管理的java对象
2.3 Spring容器创建对象的特点
1、容器对象ApplicationContext:接口
通过ApplicationContext对象,获取要使用的其他java对象,执行getBean("id")
2、Spring默认是调用类的无参构造方法,创建对象
3、Spring读取配置文件,一次创建好所有的java对象,都放在map中。
2.4 给属性赋值
Spring调用类的无参构造方法,创建对象,对象创建后给属性赋值。给属性赋值可以使用:
- xml配置文件中的标签和属性
- 使用注解
DI分类: set注入,也叫做设置注入、构造注入
2.4.1基于xml的DI
在xml的配置文件中,来完成对象的创建,属性赋值
1)set注入,也叫作设置注入
概念:Spring调用类中的set方法,在set方法中可以完成属性赋值,推荐使用
<!--简单类型的设值注入-->
<bean id="mySchool" class="com.wh.ch02dixml.ba02.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀区"/>
</bean>
<!-- 引用类型的设值注入-->
<bean id="myStudent" class="com.wh.ch02dixml.ba02.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<!--引用类型的赋值-->
<property name="school" ref="mySchool"></property>
</bean>
2)构造注入
Spring调用勒种的有参的构造方法,在创建对象的同时,给属性赋值(name ,index,省略index)
<!--构造注入-->
<bean id="myStudent" class="com.wh.ch02dixml.ba03.Student">
<constructor-arg name="myName" index="0" value="李四"/>
<constructor-arg name="myAge" index="1" value="20"/>
<constructor-arg name="mySchool" index="2" ref="mySchool"/>
</bean>
<!--声明school-->
<bean id="mySchool" class="com.wh.ch02dixml.ba03.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀区"/>
</bean>
3)引用类型的自动注入
概念:Spring可以根据某些规则给引用类型完成赋值,只对引用类型有效。规则byName,byType
- byName(按名称注入):java类中引用类型属性名称和Spring容器中bean的id名称一样,而且数据类型也是一样的,这些bean能够赋值给引用类型。
<!--byName自动注入-->
<bean id="myStudent" class="com.wh.ch02dixml.ba04.Student" autowire="byName">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
<!--声明school-->
<bean id="school" class="com.wh.ch02dixml.ba04.School">
<property name="name" value="清华大学"/>
<property name="address" value="海淀区"/>
</bean>
- byType(按类型注入):java类中引用类型的数据类型和Spring容器中bean的class值是同源关系的,这样的bean赋值给引用类型
注意:符合条件的对象只能有一个,多余一个是报错的
<!--byName自动注入-->
<bean id="myStudent" class="com.wh.ch02dixml.ba05.Student" autowire="byType">
<property name="name" value="张三"/>
<property name="age" value="26"/>
</bean>
<!--声明school-->
<bean id="mySchool" class="com.wh.ch02dixml.ba05.School">
<property name="name" value="航空大学"/>
<property name="address" value="海淀区"/>
</bean>
<!--声明school的子类-->
<!-- <bean id="primarySchool" class="com.wh.ch02dixml.ba05.PrimarySchool">
<property name="name" value="北京大兴小学"/>
<property name="address" value="大兴区"/>
</bean>-->
4)项目中使用多个spring配置文件
方式:
- 按照功能模块,一个模块一个配置文件
-按照功能分,数据库操作相关的类放在一个配置文件,service放在一个配置模块,配置redis、事务等等。
Spring管理多个配置文件,常用的是包含关系的配置文件,项目中由一个总的配置文件,里边由import标签包含其他的多个配置文件。
语法:
总的xml
<import resource="其他文件的路径">
关键字:classpath:表示类的路径,也就是类文件class文件所在的目录。spring到类的路径中加载文件。
什么时候使用classpath:在一个文件中使用其他的文件,需要使用classpath
<!--
当前是总的文件,目的是包含其他多个配置文件,一般不声明bean
语法:
<import resource="classpath:其他文件路径" />
classpath:表示类路径,类文件所在的目录,spring是通过类路径加载配置文件
-->
<!-- <import resource="classpath:ba06/spring-school.xml"/>-->
<!-- <import resource="classpath:ba06/spring-student.xml"/>-->
<!--
包含关系的配置文件,可使用通配符(*:表示任意字符)
注意:总的文件名称,不能包含在通配符范围内
<import resource="classpath:ba06/spring-*.xml" />
-->
<import resource="classpath:ba06/spring-*.xml" />
2.4.2基于注解的DI
基于注解的DI:使用spring提供的注解,完成Java对象创建、属性赋值。
注解使用的核心步骤
- 在源代码中加入注解,例如:@component
- 在spring的配置文件中,加入组件扫描器的标签:
<context:component-scan base-package="注解所在包名"/>
1、创建对象的注解
@Component
@Respository
@Service
@Controller
2、简单类型属性赋值
@Value
3、引用类型赋值
-
@AutoWired:spring提供的注解,支持byName、byType.默认byType, @Autowired + @Qualifier 使用byName
-
@Resource:来自JDK的注解,给引用类型类型赋值的,默认是byName。先使用byName,再用byType
@Resource(name="bean的名称"):只使用byName注入
2.5 IoC总结
IoC:管理对象的,把对象放在容器中,创建、赋值、管理依赖关系。通过管理对象,实现解耦合。IoC解决处理业务逻辑对象之间的耦合关系,也就是service和dao之间的解耦合
spring作为容器,管理什么对象?
- service、dao
- 工具类对象
不适合? - 实体类。(数据是动态的,数据库查出来的、前端读取的用户数据之类的)
- servlet、listener、filter等web中的对象。他们是tomcat创建和管理的。
网友评论