文章目录
一、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哪些是事务方法)------> 配置事务管理器(将事务切面中声明的事务方法引入到事务管理器中)------> 设置具体的方法的事务属性