一、基础理论和思想
1、IOC Inversion of Control 控制反转
控制:创建对象,对象属性赋值和对象之间关系管理
反转:将创建对象的权限给代码之外的容器实现,由容器代替开发人员管理对象,创建对象及 赋值
正转:由开发人员在代码中通过new构造方法的方式创建对象,开发人员主动管理对象
2、作用
将对象的创建、赋值、管理工作都交给代码之外的容器实现
减少对代码的改动,也能实现不同的功能,实现解耦合,对象的管理更松散
3、实现--di依赖注入
(1) DI(Dependency Injection):依赖注入
只需提供对象名称即可,通过对象名使用该对象
至于对象如何创建,赋值,查找都是由容器内部实现
(2)spring使用di实现IOC功能
底层创建使用的是反射机制(详见重点专栏,文尾链接)
属性赋值利用的是依赖注入:set 注入、构造注入、注解方式
4、spring默认创建对象的时间
- 在创建spring容器时,会创建配置文件中的所有对象
- spring创建对象时,默认调用无参构造函数
5、Spring的IoC容器初始化
(1)基于xml--applicationContex.xml
<1>创建容器
- 创建xml文件时,构造方法先调用父类构造方法为容器设置好Bean资源加载器
- 再调用父类setConfigLoactions方法设置Bean配置信息的定位路径
- 调用父类的refresh方法启动整个IoC容器载入Bean定义
<2>加载Bean配置资源
- 通过loadBeanDefinitions方法:首先调用调用资源加载器的方法获取要加载的资源
- 真正执行加载过程
- 加载过程:解析配置文件路径---读取配置文件内容--xml解析器将Bean信息转成文档对象---解析文档对象---存储在IoC容器的hashMap集合中(key 字符串,值 BeanDefinition)
[注]加载注册过程用synchronized保证线程安全
(2)基于注解
法1: 直接将注解Bean注册到容器中
法2:通过扫描指定的包对所有类进行处理---指定自动扫描路径(用的多)
二、IOC的实现---di技术
1、属性赋值的两种方式:
(1)XML的di实现:在spring的配置文件中,使用bean标签和属性完成对象赋值
(2)注解的di实现:使用spring注解,完成对象属性的赋值
【对象注入】
@Autowired 按类型自动注入
@Resource 按Bean的id注入,只能注入Bean类型
@Qualifier 按类型自动注入的基础上,在按Bean的id注入
【数据类型和String类型】
@Value
2、依赖注入的分类
(1)set注入:Spring调用类中属性的set方法,在set方法可以实现属性的赋值(80%使用set注入)
(2)构造注入:Spring调用有参构造方法,创建对象,在构造方法中完成赋值
3、依赖注入过程
- 通过getBean方法获取Bean实例
- 该方法调用doGetBean从IoC容器中获取bean
- 通过createBean方法创建bean对象
- 再通过CreateBeanInstance方法创建Java对象,PopulateBean方法对bean属性注入
getBean ---->doGetBean-----> createBean ----> CreateBeanInstance+PopulateBean
获取Bean实例-----创建bean对象-----创建java对象-----bean属性输入
4、Bean的生命周期
(1)IoC的初始化:对Bean定义完成资源定位、加载读取配置文件xml
解析bean信息,并将其存储在一个HashMap中
(2)对Bean实例进行创建和通过依赖注入对属性赋值----bean达可用状态
(3)Bean对象使用完成后,调用destroy方法销毁
5、Bean的作用范围---scope指定
- singleton:单例模式--无论收到多个个Bean亲求,每个容器只有一个唯一的Bean实例
- prototype:原型模式--每次Bean请求都会创建一个新的实例
- request:每次HTTP请求都会创建一个新的Bean并将其放在request域中
- session:同request,每个session中都有一个Bean实例(对象)
- global session:公用全局存储变量
三、xml属性注入-----spring配置文件中(applicationContex.xml)
(一)set注入---bean节点+property
<bean id="对象名" class="类路径">
<property name="属性名" value="一般数据类型属性值"/>
<property name="属性名" ref="引用属性值"/>
</bean>
1、一般数据类型
2、引用数据类型
(二)构造注入---bean节点+constructor-arg
<bean id="对象名" class="类路径">
<constructor-arg name="属性名" value="一般数据类型属性值"/>
<constructor-arg name="属性名" ref="引用属性值"/>
</bean>
1、通过name属性注入
2、通过index注入(属性在类中的声明顺序)
3、注入文件对象
parent:文件夹路径
child:文件夹中文件
(三)引用类型的自动注入
<bean id="" class="" autowire="byName/byType">
简单类型属性手动赋值
</bean>
1、byName -----autowire="byName "
2、byType -----autowire="byType"
四、注解方式属性赋值
1、实体类
(1)类上----@Component("student") 声明一个student对象
-----@Bean 注入第三方没有源码的类对象
(2)属性
一般属性:@value(value=”张三“)
引用类型属性:@Autowire 默认byType自动注入
2、持久层
dao层接口实现类上(daoImpl)-----@Reponsitory("studentDao")
3、业务层
service接口上------@Service("studentService")
4、控制层
controller类上-----@Controller