Spring5视频学习笔记
概念
把对象创建和对象之间的调用过程,交给spring来管理。主要为了降低类之间的耦合度。
底层原理
- xml解析
- 工厂模式(用于解耦)
- 反射
IOC容器的实现方式
- BeanFactory(Spring内部接口)
- 懒汉模式:加载配置时不会创建对象,只有在使用的时候才会创建。
- ApplicationContext(实现了BeanFactory接口,并增加了更多的功能)
- 加载配置文件时就会创建对象。(因此,可以在服务器启动时完成类的创建)
Bean管理
-
内容
- Spring创建对象
- Spring注入属性
(1) setter 注入- 为每一个属性使用 property 来注入
- p名称空间注入
(2) 有参构造器注入
当赋值的属性出现特殊符号时,使用转义或者 <![CDATA[content]]>来实现
-
实现方式
- 基于xml文件配置:默认无参构造,使用setter注入
- 基于注解
-
类型
- 普通bean:定义啥就返回啥
- 工厂bean:继承FactoryBean接口,构造工厂模式,返回不同类型。
-
作用域
- 定义:表示bean实例是单实例还是多实例;
- Spring默认创建的是单实例对象(单例模式)。
- singleton、prototype(懒汉模式)
-
生命周期
- 定义:表示bean对象从创建到销毁的过程。
- 过程:
(1)通过构造器创建bean实例
(2)为bean属性设值与对其它bean实例的引用(setter注入)
(3) 将bean实例传递到 后置处理器(Before方法)
(4)调用bean的初始化方法(需要 init-method 配置)
(5) 将bean实例传递到 后置处理器(After方法)
(6)使用bean
(7)容器关闭的时候,调用bean的销毁方法(需要 destroy-method 配置,并进行手动关闭)
-
自动装配
- 根据指定的装配规则(属性名称或属性类型),spring将自动将匹配的属性值进行注入。
- 使用 autowire标签。
基于xml配置的补充说明
注入的属性含有特殊符号时:
- 使用转义符号 < > 分别表示 < >
- 将内容写入CDATA
注入外部bean
- 类中定义外部类属性,并在构造器中传参;
- xml配置文件中使用外部类对象的bean标签id值作为ref的参数
注入内部bean
- 嵌套书写或者类似外部bean注入,使用ref进行引用。
注入对象
- 对于对象集合,使用内置的各种标签+内部bean注入;
- 导入util,并利用其构造公共集合类,方便使用。
设置单实例与多实例
spring配置文件的bean标签中有一个属性域 scope, 默认值为 singeton,表示单实例(饿汉式创建), 可以修改为 prototype,表示多实例(懒汉式创建)。
后置处理器
使用一个类实现 BeanPostProcessor 接口中的两个方法,并在xml中创建bean对象,作用域为该xml文件中的所有bean对象。
引入外部属性文件
- 引入依赖
- 构建properties外部属性文件,内部是key-value结构的值
- 在xml文件中引入context名称空间,用于引入properties文件
- 在value标签中使用表达式(格式为 ${name})利用key来获取value
基于注解方式的补充说明
格式
@注解名称(属性名称=属性值,属性名称=属性值,…)
作用域
- 类
- 方法
- 属性
创建对象的注解
- @Component
- @Service
- @Controller
- @Repository(持久层一般换为@mapper)
这四种注解的功能时一样的,命名不一致只是为了方便查看。
创建流程
- 引入 aop依赖
- 开启组件扫描
- 进行类的创建,并在类上添加创建对象注解
扫描过滤器
更改use-default-filters参数,并设置内部标签即可。
注入属性的注解
- @Autowired: 根据属性类型自动装配
- 创建对应对象,并创建对象的注解
- 在被注入对象上添加注入属性的注解
- @Qualifier:根据属性名称注入
- 需要配合@Autowired一起使用(用于多同类型实现类下的指定)
- @Resource:可以根据类型注入,也能使用名称注入
- 本身存在与javax中,Spring官方不建议使用
- @Value:注入普通类型数据
配置类注解
- @Configuration
- @ComponentScan