spring
spring概述
- spring是轻量级的开源框架
- spring可以解决企业应用开发的复杂性
- spring有两个核心部分:IOC和AOP
- IOC:控制反转,将对象交给容器管理
- AOP:面向切面,不修改代码,进行功能增强
4.spring的特点
- 方便解耦,简化开发
- AOP编程支持
- 方便程序测试
- 方便和其它框架进行整合
- 方便进行事物操作
- 降低API开发难度
IOC容器
IOC底层原理
1.什么是Ioc? (1)IOC是控制反转,把对象创建及调用过程,交给Spring进行管理 (2)使用IOC的目的是为了降低耦合性 2. IOC底层原理 xml解析,工场模式,反射
IOC接口(BeanFactory)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工场
- Spring提供IOC容器实现两种方式(两个接口) (1)BeanFactory:IOC容器基本实现,是spring内部的使用接口。加载配置文件时不会创建对象,而是要使用时才去创建对象 (2)ApplicationContext:BanFactory子类。加载配置文件时就会把配置文件对象创建
IOC操作Bean管理(基于xml)
- 什么是bean管理?
(1)spring创建对象
(2)spring注入属性
- Bean管理操作两种方式
(1)基于xml配置文件方式创建
(2)基于注解方式创建 3. IOC操作Bean管理(基于xml方式)
- 基于xml方式创建对象(默认是无参构造)
<bean id="" class=""/>
id:唯一标识
class:创建对象类的全路径
- 基于xml方式注入属性
(1) DI:依赖注入,就是注入属性
第一种注入方式:使用set方式进行注入(无参构造)
<bean id="" class="">
<property name="" value=""/>
name:属性名称
value:你所注入的属性值
</bean>
第二种注入方式:使用有参构造函数注入(有参构造)
<bean id="" class="">
<constructor-arg name="" value""/>
</bean>
- xml中注入其它类型属性(注入空值和特殊符号)
(1)字面量(null值与属性包含特殊符号)
(2)注入属性--外部bean
<bean id="" class="">
<property name="" ref="aaa"/>
name:属性名
ref:创建类对象bean标签id值
</bean>
<bean id="aaa" class=""/>
上面的ref要与下面的id值一样
(3)注入属性--内部bean(多张表关系)
<bean id="" class="">
<property name="" value=""/>
<property name="" value="">
<bean id="" class="">
<property name="" value=""/>
</bean>
</propoerty>
</bean>
4.注入属性--级联赋值
5.xml注入集合属性
(1)注入数组类型属性
<bean id="" name="">
<property name="">
<array>
<value>**</value>
<value>**</value>
</array>
</property>
</bean>
(2)注入List集合类型
<bean id="" name="">
<property name="">
<list>
<value>**</value>
<value>**</value>
</list>
</property>
</bean>
(3)注入Map类型
<bean id="" name="">
<property name="">
<map>
<entry key="" value=""/>
<entry key="" value=""/>
</map>
</property>
</bean>
(4)集合中是对象
<bean id="" name="">
<property name="">
<list>
<ref bean="id1"/>
<ref bean="id2"/>
</list>
</property>
</bean>
<bean id="id1" class=""/>
<bean id="id2" class=""/>
- 提取集合bean中公共部分
(1)在spring配置文件中引入名称空间
(2)使用util标签完成list集合注入提取
IOC操作Bean管理(FactoryBean)
- spring有两种类型bean,一种普通bean,另外一种工厂bean
- 普通bean,在配置文件中定义bean类型就是返回类型
- 工厂bean,在配置文件定义bean类型可以和返回类型不一样
Bean的作用域
1.在spring中,设置创建bean可以是单实例还是多实例
2.默认是单例的
3.如何设置单实例还是多实例
(1)在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
(2)scope值
- singleton:单实例对象
<bean id="" class="" scope="singleton"/>
- prototype:多实例对象
<bean id="" class="" scope="prototype"/>
- singleton和prototype区别
- singleton表示单实例,prototype表示多实例
- singleton,加载spring配置文件时候就创建了单实例对象
- prototype,在调用getBean方法时才创建多实例对象
Bean的生命周期
- bean生命周期
- 通过构造器创建bean实例
- 为bean的属性设置值或对其它bean引用(调用set方法)
- 调用bean的初始化的方法(需要进行配置初始化的方法)
- 使用bean(获取了对象)
- 当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)
- bean的后置处理器
自动装配
1.什么是自动装配
(1) 根据指定的装配规则(属性名称或属性类型),spring自动将匹配的属性值进行注入
(2)实现自动装配
bean标签属性autowire,配置自动装配
autowire属性常用两个值,
byname根据属性名注入,注入值bean的id要与类属性名相同
byType根据属性类型注入
IOC操作Bean管理(基于注解)
- 什么是注解?
(1)注解是代码特殊标记
(2)注解可以作用在类,方法,属性上面
(3)使用注解目的,简化xml配置
- spring针对Bean管理中创建对象提供注解
- @Component
- @Service
- @Controller
- @Repository 都可以创建bean实例
- 基于注解方式实现对象创建
(1)引入依赖
(2)开启注解
<context:component-scan base-package=""/>
4.开启注解扫描详细配置
//use-default-filters="false",表示现在不使用默认filter,自己配置filter
//context:include-filter :扫描范围
<context:component-scan base-package="" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.**"/>
</context:component-scan>
5.基于注解方式实现属性注入
(1)@AutoWired:根据属性类型进行自动装配
(2)@Qualifier:根据属性名称进行注入,使用时需要和@Autowired一起
(3)@Resource:可以根据类型注入,也可以根据名称注入
(4)@Value:注入普通类型属性
AOP
- 什么是AOP?
(1)面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的·耦合度降低,提高程序的可重用性,同时提高了开发的效率
(2)不修改源代码而增强功能
- 底层原理
AOP底层使用动态代理
(1)有接口情况:使用JDK动态代理 创建接口实现类代理对象,增强类方法
(2)无接口:使用cglib 创建子类的代理对象,增强类方法
- JDK动态代理
(1)使用Proxy类里面的方法创建代理对象
(2)调用newProxyInstance方法
newProxyInstance(ClassLoader loader,类<?>[] interface,InvocationHander h)
方法三个参数:
第一参数:类加载器
第二参数:增强方法所在的类,这个类实现的接口,支持多个接口
第三个参数:实现这个接口InvocationHander,创建代理对象,写增强方法 invoke(Object proxy,Method method,object[] args) 三个参数
proxy:代理对象
method:被增强的方法
args:参数
- 术语
- 连接点:point,类中可以被增强的方法叫做连接点
- 切入点:实际被真正增强的方法,被称为切入点
- 通知(增强):实际增强的逻辑部分称为通知(增强)
通知分类:
(1)前置通知
(2)后置通知
(3)环绕通知
(4)异常通知
(5)最终通知
- 切面:把通知应用到切入点的过程,是一个动作
事务
- 什么是事务?
(1)事务是数据库操作最基本单元,逻辑上的一组操作,要么都成功,要么都失败
- 事务四大特性(ACID)
- 原子性:强调事务是不可再分的
- 一致性:要么同时成功,要么同时失败
- 隔离性:事务在执行过程中,不会被另一个事物打扰
- 持久性:事务一旦结束,对数据库的影响是永久的
- 事务操作(Spring事务介绍)
(1)事务添加到JavaEE三层结构里面的service层(业务逻辑层)
(2)事务分类
- 编程式事务
- 声明式事务 (3)声明式事务实现
- 基于注解
- 基于xml配置文件方式
(4)在Spring进行事务管理时,底层是AOP
- 事务的传播行为
(1)分类:
- required:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
- required-new:无论是否有事务,都创建一个事务
- supports:如果存在一个事务,支持当前事务,如何没有事务,则非事务的执行
- mandatory:如果存在一个事务,支持当前事务,如果没有事务,则抛出异常
- not_supported:总是非事物地执行,并挂起任何存在的事物
- never:以非事务地执行,如果存在一个活动事物,则抛出异常
- nested:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行 (2)参数:
- @Transactional(propagation=Propagation.Required)
- isolation:事务隔离级别
(1)若没有隔离性,则会有三种问题
脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据是还没有提交的数据,那么另一个事务读到的这个数据就是“脏数据”。
不可重复读:指在一个事务内多次读取同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读取数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读
幻读:它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录。
不可重复读与幻读的区别:
不可重复读指的是事务对数据本身的修改,不涉及数据的增加或者减少,幻读指的是事务对数据记录的数量的改变(增加或者减少)
- timeOut:超时时间,默认不超时 -readOnly:是否只读,默认是flase
- rollbackFor:回滚,设置出现哪些异常进行回滚
- nor=RollbackFor:不回滚
- 事务的隔离级别
- read uncommitted(读未提交):允许另一个事务可以读取这个事务未提交的数据,可能会导致脏读,幻读,不可重复读
- read commit(读已提交):保证一个事务提交后才能被另一个事务读取,可能会导致幻读或不可重复读
- Repeataable read(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事物自己修改的,不会读取到其它事务的数据,可能会导致幻读。
- Seriallzable(可串行化):最高的隔离级别,完全服从ACID的隔离级别,所有的事物依次逐个执行,这样事务之间就完全不可能产生干扰,可以防止脏读,不可重复读以及幻读。
spring5新特性
1.支持@Nullable @Nullable可以用在方法,属性,参数上面 表示方法返回可以为空,属性可以为空,参数可以为空 4. 支持函数式风格
