Spring注解驱动开发-Aop体验

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

1.导入Aop相关的依赖

 <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>

2.写一个业务逻辑类

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

3.写一个切面类

1.@Aspect表明是一个切面
2. @Pointcut抽取公共的切入点
3.JoinPoint可以获取切入点的一些信息,比如:方法的签名,参数。返回结果等
4.JoinPoint和其他参数一起的时候,JoinPoint参数必须写在第一个

@Aspect
public class LogAspects {

    @Pointcut("execution(public int com.edward.aop.MathCalculaltor.*(..))")
    public void pointCut(){}

    @Before("pointCut()")
    public void logStar(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(""+joinPoint.getSignature().getName()+"  开始。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");

    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
    }
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logResult(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()+"抛出异常。。。@AfterReturning。。。异常信息:"+exception.getMessage());
    }
}

4.把业务逻辑和鞋面类交给spring管理

.@EnableAspectJAutoProxy @EnableAspectJAutoProxy 开启AOP功能

@Configuration
@EnableAspectJAutoProxy
public class MainConfigOfAop {
    @Bean
    public MathCalculaltor mathCalculaltor(){
        return new MathCalculaltor();
    }
    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

5.测试

业务逻辑类不能自己创建,必须从容器中获取

@Test
    public void test1(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAop.class);
        MathCalculaltor mathCalculaltor = applicationContext.getBean(MathCalculaltor.class);
        mathCalculaltor.div(5,2);
    }

6.结果

在这里插入图片描述
在这里插入图片描述

7.总结

1、导入aop模块;Spring AOP:(spring-aspects)
2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)
3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;
      通知方法:
            前置通知(@Before):logStart:在目标方法(div)运行之前运行
            后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
            返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
            异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
            环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
4、给切面类的目标方法标注何时何地运行(通知注解);
5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
[7]、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】 在Spring中很多的 @EnableXXX;
三步:
      1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)
       2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
       3)、开启基于注解的aop模式;@EnableAspectJAutoProxy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值