Spring深入学习-IOC容器
Spring深入学习-IOC容器
Spring的基本概念
1.Spring是轻量级的开源的JavaEE框架,目的是解决企业应用开发的复杂性
轻量级 -> Jar包及体积都很小,可独立使用
开源 -> 免费提供源代码
核心的组成部分IOC AOP
IOC 控制反转
把创建对象的任务由原来的程序员编写,转化为交给Spring去管理创建
概念
控制反转,将对象创建与对象之间的调用过程,交给Spring去处理,降低代码之间的耦合度
IOC底层原理
- XML解析:得到配置文件的全类名
- 工厂模式
- 反射:根据全类名,使用反射创建对象
IOC接口(BeanFactory)
IOC容器中的基本实现,Spring中内部使用的接口,一般不建议在开发中使用。在加载配置文件时候不会创建对象,在获取对象使用时才会创建对象。
IOC接口(ApplicationContext)
BeanFactory的子接口,提供了更多更强大的功能,面向开发人员提供。在加载配置文件的时候,就会将配置文件中的对象创建。由于目前较多的都是Web服务,倾向于在服务器启动时就完成资源的创建,降低用户使用服务的等待时间
实现类
- ClassPathXmlApplicationContext:传入参数为src下的类路径
- FileSystemXmlApplicationContext:传入参数为绝对路径
IOCBean管理(基于XML)
注入属性的方式有以下几种
- 基于proprity标签进行注入
- 使用有参构造constructor-arg方式进行注入
- 使用p名称空间注入,可简化XML配置(实际中使用的不多)
Bean(FactoryBean)
Spring中有两种类型的Bean,用户创建的为普通bean,另一种为工厂bean(Factory bean)
- 普通bean:定义类型即为返回类型
- 工厂bean:在配置文件中定义的类型可以与返回类型不同
Bean的作用域
bean在默认的情况下是一个单例对象,可通过设置将其设置为一个多例对象
Bean的生命周期
从对象创建到销毁的过程就称为一个生命周期
- 通过构造器创建Bean的实例(构造器)
- 为Bean的属性设置值,和对其他bean的引用(调用Set方法)
- 调用Bean的初始化方法(需要进行配置)
- Bean可以使用了(对象获取到了)
- 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
加上后置处理器后,生命周期变为7步,通过创建类,实现BeanPostProcessor
接口,并在XML方法中配置后,Spring会将其作为所有bean的后置处理器
- 通过构造器创建Bean的实例(构造器)
- 为Bean的属性设置值,和对其他bean的引用(调用Set方法)
- 调用后置处理器的
postProcessBeforeInitlization
方法 - 调用Bean的初始化方法(需要进行配置)
- 调用后置处理器的
postProcessAfterInitlization
方法 - Bean可以使用了(对象获取到了)
- 当容器关闭的时候,调用bean销毁的方法(需要配置销毁的方法)
Bean自动装配(XML)实际中用的很少
根据指定的规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
- 根据属性名称的自动装配(byName),注入属性的id值需要与声明的参数值相同
- 根据属性类型的自动装配(byType),当同类型bean存在两个及以上时,无法确定根据那个实现自动注入
Bean相关的注解
创建对象的相关注解(实际中是可以混用的)
- @Component:
- @Service:用在业务层
- @Controller:用在控制层
- @Repository:一般用于DAO层或者持久层上
上面四个注解的功能是一样的,都能用于创建对象
1.基于注解方式实现对象创建
- 在使用注解的时候需要引入AOP的依赖
- 开启组件扫描(XML文件中Component-scan配置)
- 在类上添加注解,使Spring能够将其作为组件进行创建
指定只扫描特殊类的注解(能够看懂即可)
- 将
use-default-filters
属性设置为false
后再通过include-filter
标签执行扫描那些注解 - 通过
exclude-filter
标签标记不扫描那些注解
2.基于注解方式实现属性注入
针对对象类型注入(不需要添加Set方法)
- @AutoWired:根据属性类型进行自动注入
- @Qualifer:根据属性名称进行自动注入(需要与@AutoWired一起使用)
- Resourece:可以根据类型,也可以根据名称注入
针对普通类型进行注入
- @Value 给普通数据类型注入的注解
3.完全注解开发(通常在SpringBoot中使用)
- 创建SpringConfig类,作为配置类,在类名上增加
@Configuration
注解,告诉Spring此类为配置类,用其替代XML配置文件