手记

【金秋打卡】第11天 AOP相关概念

课程信息

  • 学习课程: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切点表达式使用

打卡截图


0人推荐
随时随地看视频
慕课网APP