Spring实现AOP

 AOP:【动态代理】
     指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;

1、导入aop模块;Spring AOP:(spring-aspects)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>

2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)

public class MathCalculator {

    public int div(int i,int j){
        System.out.println("MathCalculator...div...");
        return i/j;
    }

}

3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;

通知方法:
        前置通知(@Before):logStart:在目标方法(div)运行之前运行
        后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
        返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
        异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
        环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
@Aspect
public class LogAspects {

    //抽取公共的切入点表达式
    //1、本类引用
    //2、其他的切面引用
    @Pointcut("execution(public int com.myjiang.aop.MathCalculator.*(..))")
    public void pointCut(){};

    //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+ Arrays.asList(args)+"}");
    }

    @After("com.myjiang.aop.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
    }

    //JoinPoint一定要出现在参数表的第一位
    @AfterReturning(value="pointCut()",returning="result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
    }

    @AfterThrowing(value="pointCut()",throwing="exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
    }

}
 4、给切面类的目标方法标注何时何地运行(通知注解);
 5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
 6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
 [7]、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
     在Spring中很多的 @EnableXXX;
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

    //业务逻辑类加入容器中
    @Bean
    public MathCalculator calculator(){
        return new MathCalculator();
    }

    //切面类加入到容器中
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

 

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。你可以根据自己的需求扩展和定制切面逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值