关于Spring框架的基础理解

Spring是一个轻量级Java框架,核心特性包括IoC(控制反转)和AOP(面向切面编程)。IoC通过依赖注入降低耦合,AOP实现系统级服务的复用。此外,Spring提供了事务管理,支持基于XML和注解的配置。在事务处理方面,支持不同的隔离级别、传播行为和异常处理策略。Spring的事务注解如@Transactional简化了事务管理,同时AspectJ提供更高级的AOP实现。
摘要由CSDN通过智能技术生成
Spring简介:
 
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发 的复杂性而创建的。Spring 的核心是 控制反转(IoC)和面向切面编程(AOP) 。Spring 是可 以在 Java SE/EE 中使用的轻量级开源框架。
 
Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。就是让对象和对象(模 块和模块)之间关系不是使用代码关联,而是通过配置来说明。即在 Spring 中说明对象(模 块)的关系。
 
 Spring 根据代码的功能特点,使用 Ioc 降低业务对象之间耦合度。IoC 使得主业务在相互 调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”,注入即赋值。 而 AOP 使得系统级服务得到了最大复用,且 不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成 “织入”。
 
Spring 优点:
轻量、 针对接口编程,解耦合、 AOP 编程的支持、 AOP 编程的支持。
 
IoC 控制反转:
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值, 依赖的管理。
Spring 框架使用依赖注入(DI)实现 IoC。
 
A pplicationContext 接口(容器)
 
 ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现 类有两个。
 
 
 
A、配置文件在类路径下 若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现 类进行加载。
  

 

 
B、 ApplicationContext 容器中对象的装配时机 
ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。 以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
 
 C、 使用 spring 容器创建的 java 对象
Di的实现有两种方式:
在Spring中配置文件,叫做基于XML的DI实现。 一种是使用spring中的注解,叫做基于注解实现。
基于XML实现:
 
bean 实例在调用无参构造器创建对象后,就要对 bean 对象的属性进行初始化。初始化 是由容器自动完成的,称为注入。
 
set基本数据类型注入:
set 注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。这种注入方式简单、 直观,因而在 Spring 的依赖注入中大量使用。
 
set引用数据类型注入:
当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系。ref 的值必须为某 bean 的 id 值。
 
构造类型注入:
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即,使用构造器设 置依赖关系。
 
 
关于 引用类型属性自动注入
 
 byName 方式自动注入和 byType 方式自动注入
注意:byType中的<bean>符合条件只能有一个,多了会报错
 
为应用指定多个 Spring 配置文件
多个配置文件中有一个总文件,总配置文件将各其它子文件通过引入。在 Java 代码中只需要使用总配置文件对容器进行初始化即可。
 
 
 
 
基于注解的实现DI:
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
 
注解的定义:
创建普通类@Component注解,@Repository、@Service、@Controller这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义, @Repository 用于对 DAO 实现类进行注解 ,@Service 创建业务层对象,业务层对象可以加入事务功能,@Controller 注解创建的对象可以作为处 理器接收用户的请求。
 
@Value注解
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
 
byType 自动注入@Autowired
用于给引用数据类型的属性赋值,该注解默认使用按类型自动装配 Bean 的方式
 
 
byName 自动注入@Autowired 与@Qualifier
 
 
 
JDK 注解@Resource 自动注入
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean, 则会按照类型进行 Bean 的匹配注入。
 
 
AOP 面向切面编程: 
AOP 简介 
AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程 序运行过程。 AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。
 
面向切面编程对有什么好处?
 1.减少重复; 
 2.专注业务; 
注意:面向切面编程只是面向对象编程的一种补充。 使用 AOP 减少重复代码,专注业务实现:
 
 
AOP 编程术语:
 
1) 切面(Aspect) 切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面 是通知(Advice)。实际就是对主业务逻辑的一种增强。
 
2) 连接点(JoinPoint) 通常业务接口中的方法均为连接点。 
 
3) 切入点(Pointcut) 切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法,就是多个JoinPoint。 
 
4) 目标对象(Target) 目 标 对 象 指 将 要 被 增 强 的 对 象 。 给哪个类的方法增加功能, 这个类就是目标对象。
 
5) 通知(Advice) 通知表示切面的执行时间,Advice 也叫增强。
 
AspectJ 对 AOP 的实现:
AspectJ是一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。
 
aspectJ框架实现aop有两种方式:
1.使用xml的配置文件 : 配置全局事务
2.使用注解,我们在项目中要做aop功能,一般都使用注解, aspectj有5个注解。
 
@Aspect  aspectj框架中的注解。
* 作用:表示当前类是切面类。
* 切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
* 位置:在类定义的上面
 
AspectJ 中常用的通知有五种类型:
(1)前置通知  @Before
(2)后置通知  @AfterReturning
(3)环绕通知  @Arount
(4)异常通知  @AfterThrowing
(5)最终通知  @After
 
AspectJ 的切入点表达式:
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
 
AspectJ使用步骤:
 
1.定义切面类使用@Aspect注解
 
2.表示切面执行的位置(目标类执行的位置),使用的是切入点表达式。使用的是前置通知 ]@Before 前置通知-方法有 JoinPoint 参数
 
注册 AspectJ 的自动代理: 只需要在 Spring 配置文件中注册一个基于 aspectj 的 自动代理生成器,其就会自动扫描到@Aspect 注解,并按通知类型与切入点,将其织入,并 生成代理。
 
 
@Around 环绕通知-增强方法有 ProceedingJoinPoint 参数:
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值 ,Object 类型。并 且方法可以包含一个 ProceedingJoinPoint 类型的参数。
注:后置通知、异常通知等功能类似
 
关于Spring-Mybatis的集成
 
 
Spring 事务
spring提供一种处理事务的统一模型, 能使用统一步骤,方式完成多种不同数据库访问技术的事务处理。
  -使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理
  -使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理。
 
事务定义接口 TransactionDefinition 中定义了事务描述相关的三类常量:
事务隔离级别、 事务传播行为、事务默认超时时限,及对它们的操作。
 
事务的隔离级别:有4个值。
DEFAULT:采用 DB 默认的事务隔离级别。
MySql 的默认为 REPEATABLE_READ;
Oracle默认为READ_COMMITTED。
➢ READ_UNCOMMITTED:读未提交。未解决任何并发问题。
➢ READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
➢ REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
➢ SERIALIZABLE:串行化。不存在并发问题。
 
事务的超时时间: 
表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。 单位是秒, 整数值, 默认是 -1.
 
事务的传播行为 :
 控制业务方法是不是有事务的, 是什么样的事务的。 7个传播行为,表示你的业务方法调用时,事务在方法之间是如果使用的。
PROPAGATION_REQUIRED 指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事 务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。
 
PROPAGATION_REQUIRES_NEW :总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
 
PROPAGATION_SUPPORTS : 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
 
以上三个需要掌握的
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
 
事务提交事务,回滚事务的时机:
      1)当你的业务方法,执行成功,没有异常抛出,当方法执行完毕,spring在方法执行后提交事务。事务管理器commit
    
     2)当你的业务方法抛出运行时异常或ERROR, spring执行回滚,调用事务管理器的rollback
         运行时异常的定义: RuntimeException  和他的子类都是运行时异常, 例如NullPointException , NumberFormatException
      
     3) 当你的业务方法抛出非运行时异常, 主要是受查异常时,提交事务
        受查异常:在你写代码中,必须处理的异常。例如IOException, SQLException
 
 
使用 Spring 的事务注解管理事务
使用@Transactional的步骤:通过@Transactional 注解方式,可将事务织入到相应 public 方法中,实现事务管理。
1.声明事务管理器和事务注解驱动
 
2.在业务逻辑代码service类中的方法上加上@Transactional注解,注解的所有可选属性如下所示: 
➢ propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举,默认值是Propagation.REQUIRED。 
➢ isolation:用于设置事务的隔离级别。该属性类型为 Isolation 枚举,默认值为 Isolation.DEFAULT。 
➢ readOnly:用于设置该方法对数据库的操作是否是只读的。该属性为 boolean,默认值 为 false。 
➢ timeout:用于设置本操作与数据库连接的超时时限。单位为秒,类型为 int,默认值为 -1,即没有时限。 
➢ rollbackFor:指定需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有 一个异常类时,可以不使用数组。
 
 
使用 AspectJ管理事务
适合大型项目,有很多的类,方法,需要大量的配置事务,使用aspectj框架功能,在spring配置文件中
  声明类,方法需要的事务。这种方式业务方法和事务配置完全分离。
 
实现步骤:
1.要使用的是aspectj框架,需要加入依赖
2.声明事务管理器对象
3.声明方法需要的事务类型(配置方法的事务属性【隔离级别,传播行为,超时】)
4.配置aop:指定哪些哪类要创建代理。   
 
------------------------------>所学来自动力节点王老师
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值