spring框架梳理

一、IOC

1.IOC:反转控制

将对象的创建交由spring控制,开发人员只需从IOC容器中取出使用即可。使用IOC容器获取对象前需要创建IOC容器的对象,然后使用getBean()方法。

 ApplicationContext ioc =  new ClassPathXmlApplicationContext("applicationContext.xml"); //加载classpath下面配置文件。

容器中对象的创建 和 属性的赋值,在容器创建完成的时候就已经创建好了,并且默认是单实例的。

2.DI:依赖注入

spring在创建对象的过程中,会将对象依赖的属性注入到类中。

3.bean相关内容:

在xml配置文件中,通过bean标签配置哪一个类需要反转控制,并配置相关依赖的属性值。
(1)给bean的属性赋值:有多重不同的赋值方法

  • property方法(setXxx):通过bean的property标签,spring会将name属性值的每个单词首字母转换成大写,然后再在前面拼接上”set”构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入。
  • 通过bean的构造器赋值
  • 名称空间方式
  • bean的级联属性
  • 内部bean,外部bean

(2)bean的高级配置:

  • 配置信息的继承
  • bean之间的依赖
  • bean的作用域
  • bean的生命周期

(3)bean的创建方法:

  • 静态工厂
  • 实例工厂
  • FactoryBean

(4)引用外部属性文件:
首先创建properties属性文件,通过context名称空间引入并制定文件的位置,然后在bean中获取properties属性文件中属性的值。

4.自动装配:
value 或者ref的方式明确指定属性值都是手动装配。
自动装配:根据指定的规则,不需要明确指定,spring将自动匹配的属性值注入到bean中。

  • 根据类型:将类型匹配的 bean 作为属性注入到另一个 bean 中。 若 IOC 容器中有多个与目标 bean 类型一致的 bean,Spring 将无法判定哪个 bean 最合适该属性,所以不能执行自动装配
  • 根据名称:必须将目标 bean 的名称和属性名设置的完全相同
  • 根据构造器:当 bean 中存在多个构造器时,此种自动装配方式 将会很复杂。不推荐使用。

5.SpEL

Spring Expression Language,Spring 表达式语言,简称 SpEL。支持运行时查询 并可以操作对象图。 和 JSP 页面上的 EL 表达式、Struts2 中用到的 OGNL 表达式一样,SpEL 根据 JavaBean 风格的 getXxx()、setXxx()方法定义的属性访问对象图,完全符合我们熟 悉的操作习惯。
SpEL 使用#{…}作为定界符,所有在大框号中的字符都将被认为是 SpEL 表达式。

6.通过注解配置bean

需要导入aop包,相对于xml配置bean而言,注解的方式更加优雅和简洁。

(1)使用注解标识组件:

  • ①普通组件:@Component 标识一个受 Spring IOC 容器管理的组件
  • ②持久化层组件:@Respository 标识一个受 Spring IOC 容器管理的持久化层组件
  • ③业务逻辑层组件:@Service 标识一个受 Spring IOC 容器管理的业务逻辑层组件
  • ④表述层控制器组件:@Controller 标识一个受 Spring IOC 容器管理的表述层控制器组件

组件命名规则:
[1]默认情况:使用组件的简单类名首字母小写后得到的字符串作为 bean 的 id
[2]使用组件注解的 value 属性指定 bean 的 id

注意:事实上 Spring 并没有能力识别一个组件到底是不是它所标记的类型,即 使将@Respository 注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository、@Service、@Controller 这几个注解仅仅是为了让开发人员自己明确 当前的组件扮演的角色。

(2)组件被上述注解标识后还需要通过 Spring 进行扫描才能够侦测到。

指定被扫描的包:

<context:component-scan base-package="com.atguigu.component"/>
  • [1]base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基 类包及其子包中的所有类。
  • [2]当需要扫描多个包时可以使用逗号分隔。
  • [3]如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属 性过滤特定的类,
  • [4]包含与排除:可以设置要包含的类或者要排除在外的目标类

(3)使用@Autowired注解实现自动装配:

@Autowired标注的属性 对应的组件一定要在容器中存在。
在这里插入图片描述
在这里插入图片描述

4.带泛型的依赖注入:

二、AOP

  • AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。
  • AOP 编程操作的主要对象是切面(aspect),而切面模块化横切关注点
  • 在应用 AOP 编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪 里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特 殊的类里——这样的类我们通常称之为“切面”。

1.AOP术语:

  • 横切关注点 :从每个方法中抽取出来的同一类非核心业务
  • 切面(Aspect) :封装横切关注点信息的类,每个关注点体现为一个通知方法
  • 通知(Advice):切面必须要完成的各个具体工作
  • 目标(Target) :被通知的对象
  • 代理(Proxy): 向目标对象应用通知之后创建的代理对象
  • 连接点(Joinpoint) :横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类 某个方法调用前、调用后、方法捕获到异常后等
  • 切入点(pointcut): 定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观 存在的事物。如果把连接点看作数据库中的记录,那么切入点就是查询条件—— AOP 可 以 通 过 切 入 点 定 位 到 特 定 的 连 接 点 。 切 点 通 过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的 查询条件。

2.使用@AspectJ注解声明切面:

  • 1.将目标类和切面类(封装了通知方法)加入到ioc容器中
  • 2.告诉spring到底哪个是切面类(使用@Aspect)
  • 3.告诉spring切面类中的每一个方法,都是何时何地运行(使用通知方法并设置切入点表达式
  • 4.开启基于注解的AOP模式:在配置文件中开启注解的名称空间:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>在这里插入图片描述

3.切入点表达式:

切入点表达式语法格式:
在这里插入图片描述
切入点表达式的实际应用到实际的切面类中:
在这里插入图片描述
重用的切入点表达式:
在这里插入图片描述

4.当前连接点的细节:

切入点表达式通常都会是从宏观上定位一组方法,和具体某个通知的注解结合起 来就能够确定对应的连接点。那么就一个具体的连接点而言,我们可能会关心这 个连接点的一些具体信息,例如:当前连接点所在方法的方法名、当前传入的参 数值等等。这些信息都封装在 JoinPoint 接口的实例对象中。

5.通知方法的细节:

见笔记。

6.以xml方式配置切面:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、事务:

1.基本概念:

在这里插入图片描述(1)spring提供的事务管理器:
Spring 的核心事务管理抽象是 PlatformTransactionManager。它为事务管理封装 了一组独立于技术的方法。无论使用 Spring 的哪种事务管理策略(编程式或声明 式),事务管理器都是必须的事务管理器可以以普通的 bean 的形式声明在 Spring IOC 容器中。

(2)事务管理器的主要实现:

  • ①DataSourceTransactionManager:在应用程序中只需要处理一个数据源,而且 通过 JDBC 存取。
  • ②JtaTransactionManager:在 JavaEE 应用服务器上用 JTA(Java Transaction API) 进行事务管理
  • ③HibernateTransactionManager:用 Hibernate 框架存取数据库

(3)事务的传播行为:
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方 法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 事务的传播行为可以由传播属性指定。Spring 定义了 7 种类传播行为。
在这里插入图片描述
事务传播属性可以在@Transactional 注解的 propagation 属性中定义。

(4)事务的隔离级别:
数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各 种并发问题。一个事务与其他事务隔离的程度称为隔离级别 SQL 标准中规定了多种事 务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好, 但并发性越弱。
在这里插入图片描述
用@Transactional 注解声明式地管理事务时可以在@Transactional 的 isolation 属性中设置隔离级别。

(5)触发事务的回滚异常设置:
在这里插入图片描述
(6)事务的超时和只读:
由于事务可以在行和表上获得锁,因此长事务会占用资源,并对整体性能产生影响。 如果一个事物只读取数据但不做修改,数据库引擎可以对这个事务进行优化。

  • 超时事务属性:事务在强制回滚之前可以保持多久。这样可以防止长期运行的事务 占用资源。
  • 只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎 优化事务。
    在这里插入图片描述

2.配置实现:

基于注解:
1.在ioc容器中声明事务管理器,并设置要控制的数据源
2.开启基于注解的事务控制,依赖tx名称空间
在这里插入图片描述
3.在方法中加上@Transactional,并设置相关属性

基于XML:
在这里插入图片描述
步骤:配置事务切面(告诉spring哪些是事务方法)------> 配置事务管理器(将事务切面中声明的事务方法引入到事务管理器中)------> 设置具体的方法的事务属性

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值