一.什么是spring
是一个框架,核心技术是ioc和aop,实现解耦合
spring是一个容器,容器中存放的是java对象,我们可以从根据需要从容器中取出相应的对象
二.怎么使用spring
spring是一个容器,把项目中的对象放入容器中,根据需求通过getBean()方法从容器中获得对象
让容器完成对象的创建,赋值操作,管理对象
三.什么样的对象应该放入容器中?
dao, service, controller, 工具类等
使用xml的配置文件,使用<bean>
使用注解
spring容器中的对象默认都是单例,在容器id唯一标识一个bean
四.不放人容器中的对象有哪些
实体类对象
servlet、listener、 filter
五.如何使用spring
1.创建maven项目,加入spring的依赖
2.创建类:接口,实现类,没有接口的类
3.创建spring容器的配置文件,使用<baen>声明对象
4.我们使用容器中的对象,通过ApplicationContext的实现类ClassPathXmlApplicationContext读取配置文件,然后调用getBean("beanId")获取对象
六.核心技术
控制反转(IOC)
理论:指导开发人员,将对象创建、对象赋值、对象管理的工作交给容器完成
实现:DI(依赖注入),开发人员只需提供对象的名称,对象的创建、查找、赋值、管理工作都由容器完成
spring使用的是DI,底层使用反射的机制
DI给属性赋值
1.set注入,spring调用类的set方法来给属性赋值的
简单类型的set注入,使用<property name="属性名" value="属性值">
引用类型的set注入,使用<property name="属性名" ref="beanId"/>
2.构造注入:spring调用有参数的构造器来给属性赋值
使用<constructor-arg>的name属性,name表示构造方法的形参名
使用<constructor-arg>的index属性,从0开始,表示构造方法中形参的位置
3.自动注入
spring根据某种规则,给引用类型赋值,常用的方式有两种:byType、byName
1)byName按属性名称注入:java类中引用类型的名称和spring容器中<bean>的id一样,数据类型一样,这样的bean就能赋值给引用类型了
2)byType按类型注入:java类中引用类型的类型和spring容器中bean的class是同源关系的,这样的bean可以赋值给类的引用类型
4.同源关系
类型一样
父子类
接口实现类
5.常用注解
1)@Component,创建对象的
2)@Repositroy,创建dao对象,用来访问数据库的
3)@Service,创建service对象,处理业务逻辑的,可以有事务
4)@Controller,创建控制器对象的,接收请求,返回处理结果
5)@Value:给简单类型赋值的
6)@Autowired:spirng框架中给引用类型赋值的,支持byName、byType两种方式,默认使用byType
7)@Resource:JDK提供的注解,使用自动注入给属性赋值,支持byName、byType,默认使用byName
6.注解的使用
1)加入spring-context依赖,同时会加入spring-aop
2)在类中加入注解
3)在spring的配置文件要加入组件扫描器的标签<context:component-scan base-package="包名"/>
七.Ioc能够实现解耦合
实现业务对象之间的解耦合,例如service和dao之间的解耦合
八.aop面向切面编程
底层是动态代理
1.JDK的动态代理
使用jdk反射包中的类创建代理的功能
要求:目标类必须实现了接口
2.cglib动态代理
使用第三方的工具库,实现代理对象的功能
要求:目标类必须能够继承,不能是final修饰的类
原理:就是继承,子类就是代理对象
aop可以看作是实现动态代理的一种规范,它把实现动态代理的步骤进行了规范化
3.aop的作用
1)在目标类不增加代码的情况下,给目标类增加功能。
2)减少重复的代码
3)让开发人员更加专注于业务逻辑的实现
4)解耦合:将业务功能和日志、事务等非业务功能解耦
4.什么时候用?
1)当你需要修改系统中某个类的功能,原有类的功能不完善,而你又没有源代码的情况
2)当你需要给项目中多个类增加相同的功能时
3)给业务方法增加事务、日志输出等功能时
5.aop实现的框架
1)spring实现了aop,实现方式是接口
2)aspectJ
使用注解的方式实现aop的功能
使用xml配置文件中的标签可以实现aop的功能
6.aop的概念
1)aspect表示给方法增加的功能,一般是日志输出、事务、权限检查等切面
2)pointcut切入点,是一个或多个joinpoint的集合,表示切面功能执行的位置
3)advice通知,也叫增强,表示切面执行的时间,在目标方法前执行、或者在目标方法之后执行等等
7.aspectJ框架的使用
通知注解,表示切面的执行时间
1)@Before前置通知,表示在目标方法前增加功能
2)@AfterReturning后置通知:在目标方法之后执行的。能够得到目标方法的返回值
3)Around环绕通知,可以在目标方法前后增强功能,能够控制目标方法的访问,修改目标方法的返回值
4)AfterThrowing异常通知:在目标方法抛出异常后所执行的通知
5)@After最终通知:总是会被执行的代码
6)@PointCut定义和管理切入点辅助注解
8.代理的使用
1)有接口的,默认使用的是JDK的动态代理
2)没有接口的,使用的是Cglib动态代理
3)有接口的,也可以指定使用cglib动态代理
2)切入点表达式,表示切面的位置。execution(访问修饰符public 方法返回值类型 包名.类名.方法名(方法的参数) 异常)
子主题
九.spring整合mybatis
1.整合的想法:使用spring的ioc技术,将mybatis框架中的对象交给spring容器进行统一的创建和管理。例如Service对象,Dao对象,工具类对象等
2.交给spring的mybatis对象
1)DataSouce数据源,使用阿里公司的Druid
2)SqlSessionFacotry对象,使用SqlSessionFactoryBean在内部创建SqlSessionFactory
3)Dao代理对象,使用MapperScanConfigurer,在这个类的内部调用getMapper()创建Dao的对象
十。Spring的事务处理
1.什么是事务
事务是指一组Sql语句的集合,这些sql语句要么都执行成功,要么都不执行。这些sql语句是一致,作为一个整体执行
1)原子性:一个事务要么都执行成功提交,要么全部失败回滚,不能只执行其中一部分,这就是事务的原子性
2)一致性:事务的执行不能破坏数据的完整性和一致性;一个事务在执行之前和执行之后,数据库必须处于一致性状态。
3)隔离性:发生在并发的环境中,指一个事务的执行过程不能被其他事务所干扰。
01.读未提交,出现脏读、不可重复读、幻读
02.读已提交,可解决脏读,无法解决不可重复读、幻读,Oracle默认的隔离级别
03.可重复读:可解决脏读、不可重复读,无法解决幻读。mysql InnoDB存储引擎的默认隔离级别
04.串行化:能够解决脏读、不可重复读、幻读、隔离级别最高,但是并发性能最低。
4)持久性:一个事务如果提交成功,那么它对数据状态的变更会永久性的保存到数据库中
2.什么时候需要事务
涉及多个表、多个sql语句的增删改
在java开发中,事务是放在service类中的业务方法上的。
3.通常使用JDBC访问数据,还是使用myBatis访问数据呢?该如何处理事务?
jdbc
Connection conn
conn.commit
conn.rollback
mybatis
SqlSession.commit
SqlSession.rollback
hibernate
Session.commit
Session.rollback
4.不同的事务处理方式带来的问题
1)不同的数据库访问技术,在处理事务上会有所不同。需要了解不同数据库访问技术处理事务的原理
2)掌握多种数据库中,事务的处理逻辑,你需要什么时候提交、什么时候回滚,以及相应的方法
5.怎么解决
spring提供一种统一的模型,能够使用统一的步骤来完成多种数据库访问技术的事务处理。
6.如何做?
1)spring处理事务的模型和步骤都是固定的,把事务的使用信息提供给spring就可以了。
spring内部提交、回滚事务,使用的事务管理器,它来完成事务的commit和rollback
2)事务管理器是一个接口和它的众多实现类
01.接口:PlatformTransactionManager
02.如果使用的是mybatis访问数据库,对应的接口实现类:DataSourceTransactionManager
03.使用Hibernate访问数据库,对应的接口:HibernateTransactionManager
2.声明相应数据库访问技术的实现类,在spring配置文件中声明该实现类的bean
例如使用mybatis:<bean id="xxx" class ="...DataSourceTransactionManger">
3.声明需要的事务方法和相应的参数
01.隔离级别
02.事务的超时时间:表示一个方法的最长执行时间,如果方法执行时超过了这个时间,那么事务就回滚了,单位s,默认是-1表示没有最长时间
03.事务的传播行为:用来控制业务是否具有事务,是什么样的事务
有七个传播行为,表示业务方法在调用时,事务在方法之间是如何使用的。常用的有三个
03-1.PROPAGATION_REQUIRED:指定的方法必须在事务中执行,若当前存在事务,则加到当前事务中,若没有,则创建新事务。这是spring默认 的传播行为。
03-2.PROPAGATION_REQUIRES_NEW:总是创建一个事务,若当前存在事务,则将当前事务挂起,直至新事务执行完毕。
03-3.PROPAGATION_SUPPORTS:指定方法支持事务执行,若没有事务,也可以执行
04.提交事务,回滚事务的时机
04-1.提交事务:当你的业务方法执行成功,没有异常抛出,当方法执行完毕后,spring会调用事务管理器的commit自动提交事务。
04-2.当你方法抛出运行时异常或Errors时,spring执行回滚,它会调用事务管理器的rollback方法。
运行时异常RuntimeError以及它的子类异常
04-3.当你的方法抛出非运行时异常,主要是受查异常时,spring默认会提交事务。
受查异常,在你写代码必须处理的异常:IOException等
7.Spring框架中提供的事务处理方案
1).适合中小项目使用的:注解方案。Spring使用aop给方法增加事务功能,使用注解:@Transactional,放在public方法上边,表示当前方法具有事务。可以给注解赋值,表示隔离级别,传播行为等。
01.propagation:表示事务的传播行为,默认为PROPAGATION_REQUIRED
02.isolation:表示事务的隔离级别
03.rollback:指定回滚的异常类
04.timeout:超时时限,么欧人没有时限。
05.readOnly:用于设置对数据库的操作是否为只读,默认为false
....
十一.@Transactional使用步骤
1.声明事务管理器对象:<bean id="xxxx" class="...DataSourceTransactionManager">
2.开启事务注解驱动
3.在目标方法上加@Transactional
十二.适合大型项目,有很多的类,很多的方法需要配置事务。使用aspectJ框架功能,在spring配置文件中声明类,方法需要的事务,这种方式让业务方法和事务完全隔离。
实现步骤:都是在xml文件实现
1.加入aspectJ依赖
2.声明事务管理器对象<bean id="xxxx" class ="...DataSourceTransactionManager">
3.配置方法的事务属性
隔离级别
传播行为
超时时间