【框架学习】AOP切面详解
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切面详解相关推荐
- Spring框架学习教程,详解Spring注入bean的几种方式
首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...
- springboot配置aop切面详解
1 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>sp ...
- Django框架学习 —9模板详解 -- DTL
作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器 模板致力于表达外观,而不 ...
- spring框架 AOP核心详解
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- Spring面向切面编程(AOP)详解
Spring面向切面编程(AOP)详解 面向切面编程(AOP)是Spring框架的另外一个重要的核心内容. 而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理. 动态代理概念:在程 ...
- halcon例程讲解_跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量
跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...
- 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te
深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) 机器之心 2017-06-25 12:27 阅读:108 摘要:参与:李泽南.李亚洲本周一(6月19日)机器之心发表文章<我的深 ...
- Android Binder框架实现之Parcel详解之基本数据的读写
Android Binder框架实现之Parcel详解之基本数据的读写 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android ...
- java集合框架史上最详解(list set 以及map)
title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...
最新文章
- 互联网团队协作:可追溯【连载三】
- 如何仅从git存储库中稀疏签出单个文件?
- python requests text content_python request text 和 content的区别
- linux32安装pgsql,Linux安装pgsql
- 计算机linux入门教程,Turbolinux入门教程1
- 7-zip来解压大于4G以上打包文件
- 计算机专业自然辩证法期末论文,清华大学自然辩证法-期末论文.docx
- Extjs 实现Iframe的子窗口遮罩整个页面
- python 下采样和上采样
- ORACLE进制转换函数
- mysql 执行查询_MySQL执行一个查询的过程
- 杂志社的电子邮件地址
- 大数据工程师和数据分析师有何区别
- SDN:简述对各类SDN控制器的认识
- Android-茫茫9个月求职路,终于拿满意offer
- Usb 声卡 linux,树莓派:使用usb声卡播放音乐
- 今天聊聊L2级别自动驾驶到底是个什么鬼?
- HiveSql一天一个小技巧:如何在表的特定位置添加字段
- 中南民族大学计算机科学与技术学院,中南民族大学计算机科学技术学院介绍
- 玉溪农业职业技术学院公寓维修改造项目竞争性谈判公告