spring ioc
spring 可以通过编写xml文件的方式将对象放入spring的ioc容器中进行管理; 后期优化的可以通过注解的方式放入spring ioc容器中 比如: @compment @mapper @controller 等
2. spring ioc
ioc 控制反转 反转控制 底层运用的技术:1 xml文件解析 2 工厂模式 3 反射
ioc底层就是容器,容器就是创建对象的这些工厂;
两种实现:
1. BeanFactory :IOC容器基本实现,是spring内部使用的接口, 不建议开发人员使用; 加载配置文件时不会创建对象,在使用对象时才会创建
2. ApplicationContext:是BeanFactory的子接口,比BeanFactory提供了更多更强大的功能,面向开发人员使用; ApplicationContext 两个重要的实现类: ClassPassApplicationContext SystemFileApplicationContext
ioc操作 bean管理:
1. ioc 创建对象
2. ioc 属性注入
bean管理两种方式: xml文件 注解方式
bean管理xml方式:
基于xml方式创建对象: 默认会调用类的无参构造器,如果该类没有无参构造器 会报错; 基于xml方式注入属性: DI 就是注入属性的意思; 可以通过 set方法注入,可以通过 有参构造器注入;
P名称空间注入(使用很少) 可以简化xml配置; p名称空间注入底层还是set注入;
属性注入:特殊字面量:
1 null 2 包含特殊符号的值
属性注入:外部bean
属性注入:内部bean
注入属性:级联赋值
与注入外部bean是一样的
注入属性:集合类型属性(数组\list\set\map)
设置集合元素是对象:
将list 作为公共部分提取:
在spring中引入命名空间:util
使用命名空间util完成抽取:
ioc之FactoryBean
普通bea: 在xml文件中定义的类型和返回的一样
FactoryBean:在xml文件中定义的类型和返回的可以不一样
FactoryBean: 类需要实现FactoryBean接口
ioc bean的作用域:
1. 设置bean 是单实例还是多实例 默认情况下是单实例 通过设置 scope属性值: singleton 单实例 prototype:多实例 request(一次请求) 和 session(一次对话) 基本不用
ioc bean的生命周期:
生命周期: 从对象创建到对象销毁的过程 包括以下五步骤: 初始化方法和销毁方法需要配置
1 通过构造器创建bean实例
2 给属性赋值
3 调用bean的初始化方法
4 bean可以使用
5 调用bean的销毁方法
类如果实现了 BeanPostProcessor 就会给ioc加上后置处理器 ioc中所有 bean的生命周期变为七步骤:
1 通过构造器创建bean实例
2 给属性赋值
3 把bean实例传递给后置处理器
4 调用bean的初始化方法
5 把bean实例传递给后置处理器
6 bean可以使用
7 调用bean的销毁方法
ioc 基于xml方式自动装配:
自动装配: 根据指定的装配规则(属性名称或者属性类型), spring自动将匹配的属性值 赋值 可以通过bean标签中的 autowire属性配置 byName:根据属性名称注入 byType:根据类型注入
ioc操作 xml引入外部文件
1 需要引入context 名称空间
2 在spring中使用标签引入配置文件
3 通过 表达式获取
bean基于注解方式 对象创建 注入属性
什么是注解:
1. 注解式代码特殊标记,格式: @注解名称(属性名称=属性值,属性名称=属性值)
2. 注解使用的位置 类 方法 属性 上;
3. 使用注解的目的:简化xml配置;
spring针对bean管理提供的注解:注解方式创建 ioc对象
1 controller 2 service 3 repository 4 component 以上四个注解功能相同 为了开发人员方便,spring将其设置不同命名;
使用方式:
1. 开启组件扫描 可以通过设置可以设定 包下面扫描的对象
2. 在类上添加注解
spring针对bean管理提供的注解:注解方式对 ioc对象进行 属性注入
1 @Autowired(根据属性类型进行自动装配) 2 @Qualifier(根据属性的名称进行注入) 3 @Resource(可以根据类型注入 也可以根据名称进行注入 不是spring的注解 是javax包中的注解) 4 @value(注入普通类型属性)
spring 使用注解类 代替xml配置文件(完全注解开发)
1 创建配置类代替 xml配置文件 类上加@Configuration 该类就变成了配置类; 可以通过@ComponentScan 指定扫描范围;
2 获取全局上下文的方式和之前不同:
spring aop
aop:面向切面编程; 目的是降低耦合度,提高可重用性; 通俗描述: 在不修改主干代码的基础上,添加新的功能;
aop底层原理:动态代理 jdk动态代理(主干代码 有接口)和cglib动态代理(主干代码 没有接口)
jdk动态代理:
cglib:
jdk动态代理:
可以通过 java.long.reflect 的 Proxy.class 的newProxyInstance 方法 创建代理对象
spring 底层对这两种方式进行的了封装 开发人员在使用的时候简便很多;
aop术语:
1 连接点: 可以被通知增强的 方法
2 切入点:实际被增强的 方法
3 通知:实际增加的逻辑 通知分类 环绕通知\前置通知\返回通知\异常通知\后置通知
4 切面:把通知应用到切入点的 过程
aop操作:
spring 一般是基于 AspectJ实现aop操作
AspectJ是独立框架,一般在spring中实现 aop都借用 AspectJ
具体实现方式也是两种: 1 xml文件 2 注解(实际开发中使用多)
切入点表达式:
xml文件方式实现(实际项目中基本不用):
1 在xml文件中 创建被增强类和增强类的对象
2 配置aop增强
注解方式实现:
1. 确定被增强类
2. 编写增强类和增强方法
3. 进行通知的配置 (1) 开启注解扫描 (2) 将被增强类和增强类都放入spring的ioc中 (3) 在增强类上加注解 @Aspect (4) 在spring的配置文件中 开启生成代理对象 (5) 开始配置通知
完全注解开发(生产中使用):
在增强类中 对作为通知的方法上 添加 @Before @After @AfterReturning @AfterThrowing @Around @等通知注解 同时定义通知注解的 value属性(切入点表达式)
这样调用 被增强类 切入点的逻辑 就会执行到增强类的 通知;
切入点抽取:
多个增强类 对同一个切入点进行增强可以设置 增强类的优先级: 在增强类上添加注解 @Order 其属性值越小 越优先 比如@Order(1) 比 @Order(3) 先执行;
spring jdbcTemplate:
使用步骤:
1 在springioc 中创建 DataSource 对象
2 创建 jdbcTemplate对象并且给dateSource赋值
3 使用 创建service对象 调用 dao 在dao中注入jdbcTemplage 调用数据库
jdbc操作数据库:
jdbcTemplate操作数据库的写法:
spring 事务:
概念: 事务是数据库操作的基本单元,逻辑上的一组操作,要么全部成功,要么全部失败;
事务的四大特性: 原子性\一致性\隔离性\持久性 ACID
spring事务的实现方式:
1. 编程式 事务管理
2. 申明式 事务管理(项目中使用) , 底层使用aop实现;
申明式 事务管理的实现:
(1) 基于注解方式使用(项目中使用)
(2) 基于xml 配置文件使用
spring事务基于注解方式使用:
1. 将DataSourceTransactionManager 放入spring的ioc容器中
2. 在spring xml配置文件中 引入tx名称空间
3. 开启事务的注解
4. 在需要事务管理的方法 或者 类上加 @Transactional注解
@Transactional注解 注解的属性
1. propagation:事务的传播行为,多事务方法之间进行调用 事务管理规则. 多事务方法:对数据库表数据进行变化的操作, 项目中使用前两种, 其他的了解. 默认值:required
2. isolation:事务的隔离级别: 多事务操作之间的影响级别; mybatis 默认第三隔离级别
隔离级别:读未提交 读已提交 可重复读 串行化
三个读的问题 或 现象: 脏读(问题) 不可重复读(现象) 幻读(现象)
3. timeout:事务的超时时间: 默认值 -1 表示不超时 单位是1
事务需要在一定时间内提交,如果不提交回滚
4. readOnly:是否只读:默认值false
如果设置为true 那么该事务中的方法只能查询,不能增删改了.
5. rollbackFor:回滚异常:默认值 Exception
出现哪些异常回滚
6. noRollbackFor:不回滚异常
出现哪些异常不回滚
spring事务基于xml方式使用(项目中一般不用xml方式):
1. 将DataSourceTransactionManager 放入spring的ioc容器中
2. 开启事务的注解
3. 配置通知 事务也是一种通知
4. 配置切入点和切面
事务操作 完全注解方式(项目中使用):
1. 创建配置类 代替xml配置文件 配置类:@Configuration @ComponentScan @EnableTransactionManagement 配置bean(将对象放入ioc容器中)