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)运行结束之后运行(无论方法正常结束还是异常结束)
返回通知(@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
- Spring注解驱动开发-AOP原理简述
- Spring注解驱动开发-AOP原理详解
- Spring注解驱动开发-AOP(四)
- spring中AOP 注解开发示例详解
- Spring容器切面编程 aop注解开发 五中通知类型
- Spring Aop开发基于AspectJ注解方式的案例
- Spring基于xml配置与注解驱动开发(一)
- spring中基于注解的aop实用开发
- Spring AOP开发 XML配置和注解配置
- Spring AOP的基于AspectJ注解开发
- 注解开发spring-aop 入门
- Spring 【Aspectj】进行AOP开发 (【注解】方式)
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(四.页面及小结)
- Spring整合JDBC、Spring的AOP事务开发、Spring注解整理
- Spring学习-21:Spring的AOP:基于AspectJ的注解开发
- 一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(一. 环境搭建)
- Spring基于xml配置与注解驱动开发(二)
- Spring注解驱动开发-组件注册(一)
- 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程
- (转)Spring使用AspectJ进行AOP的开发:注解方式