• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Spring【1.2AOP面向切面】

互联网 diligentman 2周前 (01-14) 9次浏览

AOP面向切面

1.什么是AOP

面向切面编程:利用AOP可以对业务逻辑的个个部分进行隔离,降低代码耦合度,不通过对源代码的修改,就可以在主功能中添加一个新的功能。

2.AOP底层原理

1)有接口(底层使用Proxy类实现)

Spring【1.2AOP面向切面】

2)没有接口

Spring【1.2AOP面向切面】

3.AOP专业术语

连接点:哪些方法可以被增强

切入点:实际被增强的方法

通知:实际增强的逻辑部分(前置通知,后置通知,环绕通知,异常通知,最终通知)

切面:把通知应用到切入点的过程

4.基于一个独立的ASpectJ框架实现Spring中的AOP操作 

引入相关依赖

 <!--AOP相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>
        
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.11</version>
        </dependency>

切入点表达式:知道哪个类中的哪个方法进行增强

execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))

5.AOP案例

1)创建被增强类User,增强类UserProxy,在增强类中设置通知

//创建对象注解
@Service
public class User {
    public void introduce(){
        System.out.println("用户介绍中.........");
    }
}
//创建对象注解与AOP注解
@Service
@Aspect
public class UserProxy {
    //通知类型注解       切入点表达式
    @Before(value = "execution(* com.pyc.aop.User.introduce(..))")
    public void before(){
        System.out.println("前置通知.....");
    }
}

2)配置xml配置文件

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    ">
    <!--开启注解扫描-->
    <context:component-scan base-package="com.pyc.aop"></context:component-scan>
    <!--生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

3)测试不同类型通知

4)抽取相同的切入点表达式

//创建对象注解与AOP注解
@Service
@Aspect
public class UserProxy {
    //通知类型注解       切入点表达式
    //抽取公共的切入点表达式
   @Pointcut(value = "execution(* com.pyc.aop.User.introduce(..))")
   public void pubPointCut(){

   }


    @Around(value = "execution(* com.pyc.aop.User.introduce(..))")
    public void around(ProceedingJoinPoint joinPoint){
        System.out.println("环绕前....");
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕后.....");
    }


    @Before(value = "pubPointCut()")
    public void before(){
        System.out.println("前置通知.....");
    }


    @After(value = "pubPointCut()")
    public void after(){
        System.out.println("后置通知.....");
    }
    
}
输出结果:
环绕前....
前置通知.....
用户介绍中.........
后置通知.....
环绕后.....

5)一个类的方法被多个代理类所增强,可以设置优先级来决定谁来执行(数值越小优先级越大)

//创建对象注解与AOP注解
@Service
@Aspect
@Order(value = 5)
public class UserProxy {
    //通知类型注解       切入点表达式
    //抽取公共的切入点表达式
   @Pointcut(value = "execution(* com.pyc.aop.User.introduce(..))")
   public void pubPointCut(){

   }

    @Before(value = "pubPointCut()")
    public void before(){
        System.out.println("UserProxy中的前置通知..... 优先级为5");
    }
}



@Repository
@Aspect
@Order(value = 10)
public class AgentProxy {

    @Before(value = "execution(* com.pyc.aop.User.introduce(..))")
    public void before(){
        System.out.println("AgentProxy中的前置通知....... 优先级为10");
    }
}

输出结果:
UserProxy中的前置通知..... 优先级为5
AgentProxy中的前置通知....... 优先级为10
用户介绍中.........

 

{{o.name}}


{{m.name}}


喜欢 (0)