AOP入门

1 AOP基本实现

1.1 如何理解AOP

名称: 面向切面编程
作用: 降低系统中代码的耦合性,并且在不改变原有代码的条件下对原有的方法进行功能的扩展.
公式: AOP = 切入点表达式 + 通知方法

1.2 通知类型

1.前置通知(Before) 目标方法执行之前执行
2.后置通知(After returning) 目标方法执行之后执行
3.异常通知(After throwing) 目标方法执行过程中抛出异常时执行
4.最终通知(After) 无论什么时候都要执行的通知
特点: 上述的四大通知类型 不能干预目标方法是否执行.一般用来做程序运行状态的记录.监控
5.环绕通知(Around) 在目标方法执行前后都要执行的通知方法 该方法可以控制目标方法是否运行.joinPoint.proceed(); 功能作为强大的.

1.3 切入点表达式

理解: 切入点表达式就是一个程序是否进入通知的一个判断(IF)
作用: 当程序运行过程中 ,**满足了切入点表达式时才会去执行通知方法,**实现业务的扩展.
种类(写法):

  1. bean(bean的名称 bean的ID) 只能拦截具体的某个bean对象 只能匹配一个对象
    lg: bean(“itemServiceImpl”)
  2. within(包名.类名) within(“com.jt.service.*”) 可以匹配多个对象
    粗粒度的匹配原则 按类匹配

1.4 AOP入门案例

@Aspect     //我是一个AOP切面类
@Component  //将类交给spring容器管理
public class CacheAOP {

    //公式 = 切入点表达式 + 通知方法

    /**
     * 关于切入点表达式的使用说明
     * 粗粒度:
     *      1.bean(bean的Id)      一个类
     *      2.within(包名.类名)    多个类
     * 细粒度
     */
    @Pointcut("bean(itemCatServiceImpl)")
    //@Pointcut("within(com.jt.service..*)")  //匹配多级目录
    //@Pointcut("execution(* com.jt.service..*.*(..))") //方法参数级别
    public void pointCut(){
        //定义切入点表达式 只为了占位
    }

    //区别:  pointCut() 表示切入点表达式的引用 适用于多个通知 共用切入点的情况
    //      @Before("bean(itemCatServiceImpl)") 适用于单个通知.不需要复用的

    // 定义前置通知,与切入点表达式进行绑定.  注意绑定的是方法
    /**
     * 需求:获取目标对象的相关信息.
     *      1.获取目标方法的路径    包名.类名.方法名
     *      2.获取目标方法的类型  class
     *      3.获取传递的参数
     *      4.记录当前的执行时间
     */
    @Before("pointCut()")
    //@Before("bean(itemCatServiceImpl)")
    public void before(JoinPoint joinPoint){
        String className = joinPoint.getSignature().getDeclaringTypeName();
        String methodName = joinPoint.getSignature().getName();
        Class targetClass = joinPoint.getTarget().getClass();
        Object[] args = joinPoint.getArgs();
        Long runTime = System.currentTimeMillis();
        System.out.println("方法路径:" +className+"."+methodName);
        System.out.println("目标对象类型:" + targetClass);
        System.out.println("参数:" + Arrays.toString(args));
        System.out.println("执行时间:" + runTime+"毫秒");
    }

// 定义后置通知,与切入点表达式进行绑定.
   @AfterReturning("pointCut()")
    public void afterReturn(){
        System.out.println("我是后置通知");
    }

// 定义最终通知,与切入点表达式进行绑定.
    @After("pointCut()")
    public void after(){
        System.out.println("我是最终通知");
    }*/

    /**
     * 环绕通知说明
     * 注意事项:
     *  1.环绕通知中必须添加参数ProceedingJoinPoint
     *  2.ProceedingJoinPoint只能环绕通知使用
     *  3.ProceedingJoinPoint如果当做参数 则必须位于参数的第一位
     */
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint){
        System.out.println("环绕通知开始!!!");
        Object result = null;
        try {
            result = joinPoint.proceed();    //执行下一个通知或者目标方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕通知结束");
        return result;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,AOP(面向切面编程)是一种强大的技术,可以在不修改原始代码的情况下增强应用程序的功能。它是一种编程范式,可以将横切关注点(例如日志记录、事务管理、安全性等)从应用程序的主逻辑中分离出来。 以下是在Spring Boot中使用AOP入门步骤: 1. 添加依赖 您需要在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个切面类 您需要创建一个切面类来定义要应用于应用程序的横切关注点。切面类应该使用@Aspect注解进行注释,并且应该包含一个或多个使用@Before、@After、@Around等注解进行注释的通知方法。 例如,以下是一个简单的切面类: ```java @Aspect @Component public class MyAspect { @Before("execution(* com.example.demo.MyService.*(..))") public void beforeAdvice() { System.out.println("Before advice called."); } @After("execution(* com.example.demo.MyService.*(..))") public void afterAdvice() { System.out.println("After advice called."); } } ``` 在上面的示例中,@Before和@After注释用于定义在执行MyService类中的任何方法之前和之后要执行的通知方法。 3. 将切面类注册到Spring Boot应用程序中 您需要将切面类注册到Spring Boot应用程序中,以便它可以在应用程序执行期间应用于横切关注点。您可以使用@Configuration注解或@ComponentScan注解来注册切面类。 例如,以下是使用@Configuration注解注册切面类的示例: ```java @Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public MyAspect myAspect() { return new MyAspect(); } } ``` 在上面的示例中,@EnableAspectJAutoProxy注解用于启用Spring Boot的自动代理功能,以便Spring Boot可以在运行时创建代理对象。@Bean注解用于将MyAspect类注册为Spring Boot应用程序的bean。 4. 测试切面 一旦您已经注册了切面类并启用了自动代理功能,您可以测试切面是否按预期工作。您可以创建一个MyService类来模拟应用程序的主逻辑,并在其中调用一个或多个方法。 例如,以下是一个简单的MyService类: ```java @Service public class MyService { public void doSomething() { System.out.println("Doing something."); } } ``` 在上面的示例中,MyService类具有一个名为doSomething()的方法,用于模拟应用程序中的主逻辑。 您可以创建一个Spring Boot测试类来测试切面是否按预期工作。例如,以下是一个简单的测试类: ```java @RunWith(SpringRunner.class) @SpringBootTest public class MyServiceTest { @Autowired private MyService myService; @Test public void testDoSomething() { myService.doSomething(); } } ``` 在上面的示例中,@Autowired注解用于将MyService类注入到测试类中。在testDoSomething()方法中,您可以调用MyService类的doSomething()方法,以便切面可以应用于该方法。 如果一切正常,您应该在控制台上看到以下输出: ``` Before advice called. Doing something. After advice called. ``` 这表明切面已成功应用于doSomething()方法,并且切面中定义的通知方法已成功调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值