一、目标
-
理解IOC的思想和使用
-
了解IOC的bean的声明周期
-
理解什么是依赖注解
二、内容分析
-
重点以及难点
-
理解IOC的思想
-
掌握IOC的使用
-
三、内容
1.概念
控制反转(IOC,Inversion of Control)是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。
以前我们在代码中,使用new 构造方法创建对象,现在不用了, 由容器代替开发人员管理对象。
2. 传统方式和ioc方式的区别
2.1 传统
我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起。
2.2 IOC
创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。
3.基本使用
3.1方式一:配置文件
-
创建java类
-
创建xml文件 resources/文件名.xml
-
xml配置(在beans标签里面配置)
<!-- id:spring生成对象的时候,放到容器里面,会给每一个对象生成一个id,用于区分对象 class:告诉他哪个类 scope="singleton"默认是单例模式,如果想调成多例模式将"singleton"成"prototype"--><bean id="student" scope="singleton" class="com.test.spring.StuService"></bean>
- 获取对象
/**IOC的基本使用**/
/**方式一:通过【配置的方式】来获取对象**/
//读取配置文件
// 生成spring容器
// 读取spring的xml文件,根据内容生成对应的对象,放到容器里面
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 通过id获取对象,传入id,通过id获取对象
StuService stuService1 = (StuService) applicationContext.getBean("student");
// 通过类获取对象,传入类,通过类获取对象
StuService stuService2 = applicationContext.getBean(StuService.class);
System.out.println(stuService2.getStuInfo());
3.2 方式二:注解
- 创建类(用@Component)
/**方式二:通过【注解】来获取对象**/
// spring扫描到这个注解的时候,会自动生成对象
@Component
@Scope("singleton")//单例模式"prototype"是多例模式
//bean id名称默认是类的首字母小写
public class TeacherService {
}
- 配置xml的component-scan(在beans标签里面配置)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描器,会去扫描注解,有对应注解的会自动生成对象 -->
<context:component-scan base-package="com.test.spring"></context:component-scan>
</beans>
- 获取对象
获取对象的方式与方式一相同,通过注释方法创建的对象的bean id是类的首字母小写后面字母大小写不变的类名
4、依赖注入
IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
4.1 使用构造函数
前提:类中需要提供一个对应参数列表的构造函数
标签:constructor-arg
标签属性:
index:指定参数在构造函数参数列表中的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称,用这个找给谁赋值
value:它能赋的值是基本数据类型和String类型
ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean
4.2 使用set赋值
标签:property
标签属性:
name:找的是类中set方法后面的部分
value:给属性赋值的是基本数据类型和String类型
ref:给属性赋值是其他bean类型的