spring实现Aop

本文介绍了如何在Spring中使用AOP进行日志记录,包括实现MethodBeforeAdvice和AfterReturningAdvice接口来创建前置和后置通知,并通过配置XML进行通知的注册和切入点设置。此外,还展示了如何自定义切面类,将通知方法直接包含在切面类中,简化了代码结构。通过这种方式,可以更灵活地管理和控制业务逻辑中的日志记录行为。
摘要由CSDN通过智能技术生成

一、使用spring api接口

1.创建一个业务接口(简单的增删改查)

package com.service;

public interface IbookService {
    void add();
    void del();
    void upd();
    void find();



}

2. 实现接口

package com.service;

public class IbookServiceImpl implements IbookService {
    @Override
    public void add() {
        System.out.println("增加");
    }

    @Override
    public void del() {
        System.out.println("删除");
    }

    @Override
    public void upd() {
        System.out.println("修改");
    }

    @Override
    public void find() {
        System.out.println("查询");
    }
}

3.创建日志类实现MethodBeforeAdvice接口,然后实现里面的方法(前置通知)

package com.log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * @author 小宝的宝
 */
public class beforeLog implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"类"+method.getName()+"方法被执行");
    }
}

方法中有三个参数

method表示受执行的目标对象的方法、args表示参数、target表示目标对象

4.创建日志类实现AfterReturningAdvice接口,然后实现里面的方法(后置通知)

package com.log;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行了"+method.getName()+"方法"+"返回值为"+returnValue);
    }
}

相比与前置通知,后置通知中多了一个参数,returnValue 表示执行方法后的返回值

5.注册bean对象

<bean id="bookService" class="com.service.IbookServiceImpl"></bean>
<bean id="before" class="com.log.beforeLog"></bean>
<bean id="after" class="com.log.AfterLog"></bean>

 6.配置aop(需要导入aop约束)

<aop:config>
    <!--expression是一个表达式,execution(要执行的位置)-->
    <aop:pointcut id="pointcut" expression="execution(* com.service.IbookServiceImpl.*(..))"/>
    <aop:advisor advice-ref="before" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="after" pointcut-ref="pointcut"/>
</aop:config>

 advice-ref指定哪个通知,pointcut-ref指向执行位置

7.测试

 //获取spring上下文对象
 ApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext.xml");
 //动态代理的是接口
 IbookService bookService =(IbookService) cpx.getBean("bookService");
bookService.add();

8.控制台结果 

二、自定义类

1.自己定义一个类(切面类 包含通知)

package com.myLog;

public class MyLog1 {

    public void before(){
        System.out.println("前置通知");
    }
    public void after(){
        System.out.println("后置通知");
    }
}

2.注册bean

<bean id="mylog1" class="com.myLog.MyLog1"></bean>
<aop:config>
     <!--定义切面-->
    <aop:aspect ref="mylog1">
      <!--定义切入点-->
        <aop:pointcut id="Mypoint" expression="execution(* com.service.IbookServiceImpl.*(..))"/>
        <!--通知-->
        <aop:before method="before" pointcut-ref="Mypoint"/>
        <aop:after method="after" pointcut-ref="Mypoint"/>
    </aop:aspect>

</aop:config>

目标更明确,就是将前置后置通知切入 execution定义的方法下,前置和后置通知在切面中

3.运行结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring框架提供了一种简单且强大的方式来实现面向切面编程(AOP)。下面是使用Spring实现AOP的步骤: 1. 添加依赖:在项目的构建文件(如Maven或Gradle)中添加Spring AOP的依赖项。 2. 创建切面类:创建一个Java类,该类包含要在目标方法执行前、执行后或抛出异常时执行的逻辑。这个类被称为切面类。 3. 定义切点:在切面类中,使用@Pointcut注解定义一个切点,它表示在哪些方法上应用切面逻辑。 4. 编通知:在切面类中编通知方法,通知方法定义了切点被触发时要执行的逻辑。Spring提供了几种类型的通知,例如@Before(前置通知)、@After(后置通知)、@AfterReturning(返回通知)和@AfterThrowing(异常通知)。 5. 配置AOP:将切面类配置为Spring的bean,并将其与目标对象关联起来。这可以通过XML配置文件或使用基于注解的配置来完成。 6. 测试:使用Spring容器创建目标对象的实例,并调用目标方法。你将看到切面逻辑会在切点处被触发执行。 这是一个简单的示例,演示了如何在Spring实现AOP: ```java // 切面类 @Aspect public class LoggingAspect { // 定义切点 @Pointcut("execution(* com.example.MyService.*(..))") public void myServiceMethods() {} // 前置通知 @Before("myServiceMethods()") public void beforeAdvice() { System.out.println("Before advice executed."); } // 后置通知 @AfterReturning("myServiceMethods()") public void afterReturningAdvice() { System.out.println("After returning advice executed."); } } // 配置文件中定义切面和目标对象的关联 <aop:aspectj-autoproxy/> <bean id="myService" class="com.example.MyService"/> <bean id="loggingAspect" class="com.example.LoggingAspect"/> // 测试 public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyService myService = context.getBean(MyService.class); myService.doSomething(); } } ``` 这是一个简单的例子,展示了如何在Spring中使用AOP。你可以根据自己的需求扩展和定制切面逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值