spring、springMVC、SpringBoot这一系列对AOP都有很好的支持(其实都是Spring管理的)



一。概念

(1)面向切面编程,实际上就是给某个方法(或者某些),做一个代理,,很抽象?代理模式详解
代理可以抽象出来,为类似方法进行代理,,从而降低代码量,(相同的功能,如关闭流什么的,只写一次,不仅方便维护,大大减少了工作量

(2)切点,
指的是,对那个方法进行代理,或者某些方法。
切点方法需要 @Pointcut

 @Pointcut("execution(public * xatu.zsl.contoller.*.*(..))")public void poincut(){}

(3)通知
即对 被代理方法,加上的操作。

  • 前置通知 @Before(“poincut()”)
  • 后置通知 @After(“poincut()”)
  • 返回时通知 @AfterReturning(pointcut = “poincut()”,returning = “object”) returning指定返回对象。
  • 抛出异常时通知 @AfterThrowing(“poincut()”)
  • 环绕通知 @Around(“poincut()”)


二。使用

前置通知 @Before(“poincut()”)

    @Before("poincut()")public void before(JoinPoint joinPoint){logger.info("before");ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//获取URLlogger.info("url={}",request.getRequestURL());//请求方法logger.info("mathod={}",request.getMethod());//iplogger.info("ip={}",request.getRemoteAddr());//类方法logger.info("class_method{}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());//参数logger.info("args={}",joinPoint.getArgs());}

后置通知 @After(“poincut()”)

  @After("poincut()")public void after(){logger.info("after");}

返回时通知 @AfterReturning(pointcut = “poincut()”,returning = “object”) returning指定返回对象。

 @AfterReturning(pointcut = "poincut()",returning = "object")public void afterReturning(Object object){logger.info("return = {}",object.toString());
//        logger.info("return = ");}

抛出异常时通知 @AfterThrowing(“poincut()”)

  @AfterThrowing("poincut()")public void afterThrowing(){logger.info("抛出异常了。");}

环绕通知 @Around(“poincut()”)

 @Around("poincut()")public void around(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("环绕通知。");joinPoint.proceed();}


三。细节

(1)
@AfterReturning和 @Around(“poincut()”),,,会有特殊冲突,,搞了半天

SpringBoot中会出现空指针异常

Spring中启动时会出现错误无法启动,错误代码如下:解决方法(注释掉,@Around(“poincut()”))

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in file [G:\work_space\study_spring\spring_demo\target\classes\xatu\zsl\service\UserServiceImpl.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut poincut
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in file [G:\work_space\study_spring\spring_demo\target\classes\xatu\zsl\service\UserServiceImpl.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut poincutat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)at xatu.zsl.MainTest.main(MainTest.java:16)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut poincutat org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193)at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:170)at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220)at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279)at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311)at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118)at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88)at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:347)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)... 16 more

(2)JoinPoint joinPoint,参数不能出现在afterReturning(),,中,,不知道为什么,,容易出错,,

【框架学习】AOP切面详解相关推荐

  1. Spring框架学习教程,详解Spring注入bean的几种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...

  2. springboot配置aop切面详解

    1 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>sp ...

  3. Django框架学习 —9模板详解 -- DTL

    作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器 模板致力于表达外观,而不 ...

  4. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  5. Spring面向切面编程(AOP)详解

    Spring面向切面编程(AOP)详解 面向切面编程(AOP)是Spring框架的另外一个重要的核心内容. 而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理. 动态代理概念:在程 ...

  6. halcon例程讲解_跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  7. 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te

    深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) 机器之心 2017-06-25 12:27 阅读:108 摘要:参与:李泽南.李亚洲本周一(6月19日)机器之心发表文章<我的深 ...

  8. Android Binder框架实现之Parcel详解之基本数据的读写

       Android Binder框架实现之Parcel详解之基本数据的读写 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android ...

  9. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

最新文章

  1. 互联网团队协作:可追溯【连载三】
  2. 如何仅从git存储库中稀疏签出单个文件?
  3. python requests text content_python request text 和 content的区别
  4. linux32安装pgsql,Linux安装pgsql
  5. 计算机linux入门教程,Turbolinux入门教程1
  6. 7-zip来解压大于4G以上打包文件
  7. 计算机专业自然辩证法期末论文,清华大学自然辩证法-期末论文.docx
  8. Extjs 实现Iframe的子窗口遮罩整个页面
  9. python 下采样和上采样
  10. ORACLE进制转换函数
  11. mysql 执行查询_MySQL执行一个查询的过程
  12. 杂志社的电子邮件地址
  13. 大数据工程师和数据分析师有何区别
  14. SDN:简述对各类SDN控制器的认识
  15. Android-茫茫9个月求职路,终于拿满意offer
  16. Usb 声卡 linux,树莓派:使用usb声卡播放音乐
  17. 今天聊聊L2级别自动驾驶到底是个什么鬼?
  18. HiveSql一天一个小技巧:如何在表的特定位置添加字段
  19. 中南民族大学计算机科学与技术学院,中南民族大学计算机科学技术学院介绍
  20. 玉溪农业职业技术学院公寓维修改造项目竞争性谈判公告

热门文章

  1. 金字塔原理(麦肯锡) 要点汇总
  2. 2021-12-14 WPF上位机 116-三菱PLC协议
  3. 如何使用3ds Max制作一把斧子
  4. 一次卸载所有python包(第三方库)
  5. c语言四大湖问题答案,上海交通大学C++课程课件.PPT
  6. R语言线性混合效应模型(固定效应随机效应)和交互可视化3案例
  7. python代码转exe
  8. 游戏设计-《游戏改变世界》-思维导图
  9. oracle查询营业执照不对的sql
  10. Win11系统禁止关机键关机的方法教学