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