课程信息
- 学习课程:Java工程师2022版
- 章节名称:Spring AOP面向切面编程-AOP相关概念
- 讲师:悟空
课程内容
Spring AOP面向切面编程:
在软件运行过程中,在执行前和执行后都可以增加扩展功能(切面),切面像浏览器中的各种插件,为原始功能提供扩展
Spring AOP:在不修改源码的情况下对程序行为进行扩展
Spring AOP——Aspect Oriented Programming 面向切面编程
AOP的做法是将通用、与业务无关的功能抽象封装为切面类
切面可配置在目标方法的执行前后运行,真正做到即插即用
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- aspectjweaver是Spring AOP的底层依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
xmlns:aop="http://www.springframework.org/schema/aop
<!-- AOP配置 -->
<bean id="methodAspect" class="com.imooc.spring.aop.aspect.MethodAspect"></bean>
<aop:config>
<!-- PointCut 切点,使用execution表达式描述切面的作用范围 -->
<!-- excution(public * com.imooc..*.*(..))说明切面作用在com.imooc包下的所有类的所有方法上 -->
<aop:pointcut id="pointcut" expression="excution(public * com.imooc..*.*(..))"></aop>
<!-- 定义切面类 -->
<aop:aspect ref="methodAspect">
<!-- before通知,代表在目标方法运行前先执行methodAspect.printExecutionTime() -->
<aop:before method="printExecutionTime" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
// 切面类
public class MethodAspect {
//切面方法,用于扩展额外功能
// JoinPoint 连接点,通过连接点可以获取目标类/方法的信息
public void printExecutionTime(JoinPoint joinPoint){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss sss");
String now = sdf.format(new Date());
String className = joinPoint.getTarget().getClass().getName();//获取目标类的名称
String methodName = joinPoint.getSignature().getName();//获取目标方法名称
System.out.println("-->" + now + ":" + className + "." + methodName);
Object[] args = joinPoint.getArgs();
System.out.println("--->参数个数:"+args.length);
for(Object arg:args){
System.out.pritnln("--->参数:"+arg);
}
}
}
Spring AOP与AspectJ的关系
Eclipse AspectJ一种基于Java平台的面向切面编程的语言
Spring AOP使用AspectJWeaver实现类与方法匹配
Spring AOP利用代理模式实现对象运行时功能扩展
时间、地点、任务
切点(pointcut)决定在什么地方
通知(before)决定在什么时间
methon决定做什么事情
Aspect 切面,具体的可插拔组件功能类,通常一个切面只实现一个通用功能
Target Class/Method 目标类,目标方法,值真正要执行与业务相关的方法
PointCut 切入点使用execution表达式说明切面要作用在系统的哪个类上
JoinPoint连接点,切面运行过程中式包含了目标类、方法元数据的对象
Advice 通知说明具体的切面的执行时机,Spring包含了五种不同类型通知
AOP配置过程
1.依赖AspectJ
2.实现切面类/方法
3.配置Aspect Bean
4.定义PointCut
5.配置Advice
JoinPoint核心方法
Object getTarget()获取IOC容器内目标对象
Signature getSignature()获取目标方法
Object[] getArgs() 获取目标方法参数
PointCut切点表达式:明确切点作用在哪些类的哪些方法上。
<aop:pointcut id="pointcut" expression="excution(public * com.imooc..*.*(..))"></aop><aop:pointcut id="pointcut" expression="excution(public * com.imooc..*.*(..))"></aop>
<!-- 匹配类名以service结尾的类为切点(这种最常用) -->
<aop:pointcut id="pointcut" expression="excution(* com.imooc..*Service.*(..))"></aop>
<!-- 2对所有没有返回值的方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(void com.imooc..*Service.*(..))"></aop>
<!-- 3只对返回字符串的方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(String com.imooc..*Service.*(..))"></aop>
<!--4对service类的以create开头的方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(void com.imooc..*Service.create*(..))"></aop>
<!-- 5对service类的无参数的所有方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(void com.imooc..*Service.create*())"></aop>
<!-- 6对service类的带有两个参数的所有方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(void com.imooc..*Service.create*(*,*))"></aop>
<!-- 7对service类的带有两个参数且第一个参数为string类型的所有方法为切点 -->
<aop:pointcut id="pointcut" expression="excution(void com.imooc..*Service.create*(String,*))"></aop>
学习收获
学习了AOP相关属性,配置步骤,简单例子配置AOP,PointCut切点表达式使用