课堂讲义
0)回顾Spring体系结构
Spring的两个核心:IoC和AOP
1)AOP简介
1.1)OOP开发思路
OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务首先构建模型,基于模型展开业务
1.2)AOP开发思想
解决的问题:将共性功能提取出去
1.3)AOP概念
-
AOP(Aspect Oriented Programing)面向切面编程,是一种编程范式,隶属于软件工程范畴。
-
AOP基于OOP基础之上进行横向开发,是对 OOP 编程方式的一种补充,并非是取而代之。
-
AOP不是由Spring提出的,最佳开源实现是AspectJ;Spring集成了AspectJ 实现AOP
1.4)AOP作用和优势
-
AOP能够将那些与业务无关,却为业务模块所共同调用的功能(例如日志记录、性能监控、事务管理、权限控制),封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于将来维护。
-
伴随着AOP时代的降临,可以从各个行业的标准化、规范化开始入手,一步一步将所有共性功能逐一开发完毕,最终以功能组合来完成个别业务模块乃至整体业务系统的开发
2)AOP入门案例(重点)
2.1)AOP核心概念
-
Joinpoint(连接点):就是方法
-
Pointcut(切入点):就是挖掉共性功能的方法
-
Advice(通知):就是共性功能,最终以一个方法的形式呈现
-
Aspect(切面):就是共性功能与挖的位置的对应关系
-
Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的
-
Weaving(织入):就是将挖掉的功能回填的动态过程
-
Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
2.2)AOP开发方式
-
纯 XML方式
-
XML+注解方式
-
纯 注解方式
2.3)入门案例制作
下面使用XML方式来开发:
1.导入aspectj的坐标
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
2.确认要抽取的功能:并将其制作成方法保存到专用的类中,最后删除原始业务中对应的功能
3.引入apo命名空间,然后将所有进行AOP操作的资源加载到IoC容器中
-
引入aop命名空间
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--3.开启AOP命名空间-->
-
在applicationContextx.xml中配置userService和通知类AOPAdvice
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/> <!--2.配置共性功能成为spring控制的资源--> <bean id="myAdvice" class="com.itheima.aop.AOPAdvice"/>
-
对比之前新增的改动
4.使用配置的方式描述被抽取功能的位置,并描述被抽取功能与对应位置的关系
<!--aop配置-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* *..*(..))"/>
<!--配置切面-->
<aop:aspect ref="myAdvice">
<!--通知与切入点之间的关系-->
<aop:before method="logAdvice" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
5.运行App类
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
2.4)AOP运行过程(理解)
-
Spring容器加载配置文件,监控所有配置的切入点方法的执行
-
当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,然后在代理对象的对应位置将通知类对应的功能织入,完成完整的代码逻辑的运行
3)AOP配置(XML)
3.1)AspectJ
-
Aspect(切面)用于描述切入点与通知间的关系,是AOP编程中的一个重要概念
-
AspectJ基于java语言实现的AOP
3.2)AOP配置
3.2.1)aop:config
-
名称:aop:config
-
类型:标签
-
归属:beans子标签
-
作用:设置AOP
-
格式:
<beans> <aop:config>……</aop:config> <aop:config>……</aop:config> </beans>
-
说明:一个beans标签中可以配置多个aop:config标签
3.2.2)aop:aspect
-
名称:aop:aspect
-
类型:标签
-
归属:aop:config标签
-
作用:设置具体的AOP通知对应的切入点
-
格式:
<bean id="myAdvice" class="com.itheima.aop.AOPAdvice"/> <aop:config> <aop:aspect ref="myAdvice"> <aop:before method="before" pointcut-ref="pt"/> </aop:aspect> </aop:config>
-
说明:
一个aop:config标签中可以配置多个aop:aspect标签
-
基本属性:
-
ref :通知类的beanId
-
3.2.3)aop:pointcut
-
名称:aop:pointcut
-
类型:标签
-
归属:aop:config标签、aop:aspect标签
-
作用:设置切入点
-
格式:
<aop:config> <aop:pointcut id="pt" expression="execution(* *..*(..))"/> <aop:aspect ref="myAdvice"> <aop:before method="before" pointcut-ref="pt"/> </aop:aspect> </aop:config>
-
说明:
一个aop:config标签中可以配置多个aop:pointcut标签,且该标签可以配置在aop:aspect标签内
-
基本属性:
-
id :识别切入点的名称
-
expression :切入点表达式
-
3.3)切入点
-
切入点描述的是某个方法
-
切入点表达式是一个快速匹配方法描述的通配格式,类似于正则表达式
3.4)切入点表达式的组成
- <