Spring
spring概述
spring是什么?
spring是一个轻量级的,非侵入式的,IOC和AOP的一站式框架,为简化企业级应用开发而生
轻量级:体积小,占用资源少
非侵入式:我们的业务代码中的类,不会继承实现spring框架中的类和接口
IOC:Inversion of Control 控制反转 以前程序中使用对象是程序员自己new
使用了spring以后,我们不需要new对象,由spring框架来管理生成对象
AOP:面向切面编程
一站式框架:它集项目整体管理,数据访问,web,测试等等于一体
在bean标签中配置需要spring框架管理的类,
把spring框架生成的对象称为一个bean对象,此对象与自己new对象是有区别的,
spring创建时,可以根据配置文件为生成的对象增强功能 IOC
使用spring框架来管理生成对象
使用spring框架中的一个实现类,读取spring配置文件,生成并管理这些对象
在程序中需要对象时,直接从spring框架中获取即可
spring搭建
1.导入spring核心功能
2.创建spring.xml配置文件
配置哪些类需要spring来管理
3.使用ClassPathXmlApplicationContext来读取配置文件
4.获取spring创建生成的对象
IOC控制反转,把什么的控制权,反转给谁
是一种编程架构思想,就是将原来程序中自己new对象的权利,反转给spring框架
实现:在是spring.xml文件中配置需要spring管理的类,
解析xml 读取配置,使用bean工厂创建对象(用到反射机制),
在spring中维护一个容器,将创建的对象管理起来, IOC容器在哪需要,在哪儿注入
控制反转:就是将在程序中创建对象的权利反转给spring框架,由spring统一管理
好处:解耦 功能增强
spring管理bean(2种)
1.在xml中配置
依赖注入 id=“对象名” class=“类的地址” name=“也可以定义对象名”
scope=“指导spring框架如何生成对象”
singleton:默认值 单例的 在一个应用程序中,为一个类只创建一个对象
对象在spring容器启动时创建
prototype:原型的 每次获取时,会创建一个新的对象
request:一次请求中创建一个
session: 一次会话中创建一个
application:一个应用程序中创建一个
在IOC的同时,会发生一个动作称为依赖注入,就是在spring创建对象的同时,为对象中注入值,注入值的方式有2种:
1.通过属性的set方法注入 2.通过构造方法注入(有弊端不建议使用)
2.使用注解方式最终使用的方式
可以使用注解标签为属性注入值
@Autowired 属于spring框架提供的注入的注解标签,一般写在属性上面或者属性的set方法上面,可以通过类型注入,也可以通过对象名称注入
不需要对象名,可以根据属性的类型,在spring容器中查找 byType
@Qualifier(value=“userDao”) 通过@Qualifier指定需要注入的对象名
默认情况下注入的属性名不能为空
@Resource 是jdk中提供的注解标签,既可以按类型注入,也可以按名称注入
@Resource @Resource (name=“userDao”)
后端=层架框
web层 servlet接收数据 <context:component-scan base-package=“com.ffyc.springpro”> </context:componet-scan>
service java处理逻辑部分
dao 数据访问
在service 调用dao
@Repository(value=“userDao”) 表示的是数据访问层
@Component(value=“user”)
@Scope(value=“singleton”) 单例
@Service (value = “user Service”)
Spring JDBC
1.spring是如何使用IOC管理其他bean,提供JDBC Template(了解即可)增删改查,mybatis
1.1 spring管理数据库连接对象 1.2 生成提供jdbcTemplate
让spring管理阿里数据源对象 druid -德鲁伊
<context:property-placeholder location=“config.properties”/>
实现了数据库连接池功能,减少了频繁创建销毁数据库连接的开销
<bean id="dataSource class=“com.alibaba.druid.pool.DruidDataSource”>
······
springjdbc模块封装了 jdbcTemplace类,用于执行sql
AOP面向切面编程
把业务之外的代码 事务提交
//获得sqlsession 横切
//获得接口代理 saveuser(){
业务代码 }
//事务提交
//关闭sqlsession
AOP面向切面编程 ,使用预编译和动态代理的方式,使用程序可以统一维护的一种技术
作用:可以将业务逻辑之间进行隔离,降低耦合度,使得开发维护方便
OOP是程序各层之间的整体设计
AOP是针对业务逻辑处理过程中某个具体的步骤进行处理
AOP为程序带来什么好处?
可以将一些公共的,重复出现的非业务代码进行提取,然后用动态代理的方式,为业务代码横切添加额外提取的功能,而且不需要显示的在业务代码中调用,可以通过一个代理对象,来帮我们调用这些抽取出来的方法
通过配置 告诉代理 在执行哪个方法时,帮助我们动态调用某个额外的方法
基本概念:
连接点:类中可以被增强的方法 切入点:类中实际被增强的方法
通知:在连接点上要做的事情 切面:把通知添加到连接点的整个过程
目标:要增的方法所在的类 代理:(淡化框架的内部实现好了的)配置完成 后,为目标对象创建一个代理对象
首先提取通知要增强的功能
发现切入点
配置
aop底层是java设计模式中的动态代理模式
AOP不是spring框架特有的技术,spring框架应用这一技术思想进行封装
spring中是集成Aspect J这样的一个AOP框架
2.spring数据访问模块的事务管理功能
spring事务管理
事务:属于数据库功能,事务可以看做是由对数据库若干操作组成的一个单元(一个整体)
在业务代码执行时,有时一个业务操作需要向数据库发送多条sql,多条sql属于同一个业务的,要求是一个整体,要么都执行成功,要么都不成功
举例:转账,网购
事务特性:原子性、隔离性、持久性、一致性
数据库事务管理就是在你将这若干操作执行完成后,需要对事务进行提交,数据库对数据进行操作,最终达到持久
数据库事务重要性,增删改操作必须在事务管理(没有问题提交,有问题不能提交)中进行
spring事务管理 spring代理我们的程序提交事务
spring中的事务管理有两种形式:
1.编程式事务:需要在代码中显示的提交事务的 注入private TransactionTemplate;
2.声明式事务:有两种实现方式: 1.在xml中配置 (需要大量的配置,为需要在事务管理中的方法增强功能) 2.注解方式实现 transactionTemplate;
怎么管理? 提供DataSourceTransaction Manager实现事务提交
管理实现原理 AOP 代理 静态代理 动态代理 jdk代理 反射 实现
cglib代理
@Transactional 注解标签可以作用在类和方法上
作用在类上,表示此类中所有的方法都会添加事务增强功能
作用在某个方法上,表示此方法添加事务增强功能
声明式事务失效场景:
1.同一个类中方法调用,导致声明式事务失效(在自己类中调用,就是普通方法调用,不会走代理的环绕通知)
2.将@Transactional应用在非public修饰的方法上
3.注解@Transactional用在的类非spring容器管理的bean
4.@Transactional注解事务传播行为设置错误
5.异常被catch捕获导致@Transactional失效
@Transactional (rollbackFor=RuntimeException) 默认出现运行时异常时不提交 可修改rollbackFor=Exception.class 对所有异常都不提交
6.数据库引擎不支持事务
Spring事务传播行为(7个)
传播 至少是两个方法之间相互调用的
事务传播行为是spring框架对事物的增强功能,与数据库无关
例如:A方法 调用 B方法 那么B应该如何执行? B方法是与A方法事务合二为一?还是自己是一个独立的?
1.@Transactional (propagation=Propagation.REQUIRED)
PROPAGATION-REQUIRED spring默认的传播行为
指定方法必须在事务内执行,若当前存在事务,则加入当前事务,若不存在,就创建
有事务的方法A 调用Propagation.REQUIRED的方法B 那么B方法事务就合并加入到A方法事务中
没有事务的方法A -----------------------------------B 那么B方法事务就自己创建一个新的事务
2.@Transactional (propagation=Propagation.SUPPORTS)
有事务的方法A 调用propagation.SUPPORTS的方法B 那么B方法事务就合并并加入到A方法事务中
没有事务···························B 那么B方法就没有事务
3.··············(····················REQUIRED_NEW)
有···A 调用······REQUIRED_NEW···B 那么就把A事务挂起,B方法自己创建一个新的事务
没有····A ·····························B 那么B方法就自己创建一个新的事务
IOC:spring来管理(整个对象的生命周期)程序中的对象,统一管理,需要时注入即可,降低耦合,对对象进行功能上的增强
AOP:将非业务代码抽取,使用代理对象,在业务代码运行时,额外调用其他公共非业务代码,增强功能,降低耦合
spring数据访问:重点spring对事务管理
实现方式 编程式事务
声明式事务
配置事务管理实现类(spring提供)
开启注解事务
底层实现,使用AOP环绕通知
方法执行前建立数据库,开启一个事务
方法执行成功,提交事务
出现异常,事务回滚
ssm搭建:
1.导入jar
2.spring配置
3.mybatis接口,映射文件