您的位置:首页 > 编程语言 > Java开发

Spring注解驱动开发-Aop体验

2019-03-23 12:50 543 查看

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)运行结束之后运行(无论方法正常结束还是异常结束)
            返回通知(@AfterRet 20000 urning):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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: