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可以赋值给类的引用类型

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.配置方法的事务属性

隔离级别

传播行为

超时时间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值