SpringAOP
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringAOP】标题:【修真院Java小课堂】SpringAOP开场语:大家好,我是IT修真院西安分院第四期郭靖,纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务五任务扩展知识点——SpringAOP(1)背景介绍:什么是AOP?什么是SpringAOP?AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。SpringAOP是一种使用了Aop技术的框架。(2)知识剖析:2.1 AOP的基本概念:1.)Aspect(切面):通常是一个类,里面可以定义切入点和通知2.)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用3.)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around4.)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式 5.)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类2.2 通知类型介绍:(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象(4)After:在目标方法完成之后做增强,无论目标方法是否成功完成。@After可以指定一个切入点表达式(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程 中核心是一个ProceedingJoinPoint2.3 SpringAop的两种使用方式:1、使用XML文件配置的方式2、使用注解的方式:启用@AsjectJ支持,在applicationContext.xml中配置 <aop:aspectj-autoproxy>(3)常见问题:3.1怎样定义切入点表达式3.2切入点表达式有哪几种写法3.3多个包使用AOP时怎样写切入点表达式3.4关于通知的优先级问题(4)解决方案:4.1 切入点的定义和表达式:Spring AOP支持的切入点指示符:A:@Pointcut("execution(* com.aijava.springcode.service..*.*(..))")第一个*表示匹配任意的方法返回值,..(两个点)表示零个或多个,上面的第一个..表示service包及其子包,第二个*表示所有类,第三个*表示所有方法,第二个..表示方法的任意参数个数 B:@Pointcut("within(com.aijava.springcode.service.*)")within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点 C:@Pointcut("this(com.aijava.springcode.service.UserService)")this用来限定AOP代理必须是指定类型的实例,如上,指定了一个特定的实例,就是UserService D:@Pointcut("bean(userService)")bean也是非常常用的,bean可以指定IOC容器中的bean的名称 4.2 组合切入点:在多个表达式之间使用 || 、 or 表示 或 ,使用 && , and 表示 与 , ! 表示非。4.3通知执行的优先级:进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。 注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。(5)编码实战:(6)拓展思考:基于注解与基于配置文件的优缺点优点: 注解能减少配置的工作,而且配置信息和JAVA代码放在一起,有助于增强程序的内聚性。相对于XML配置文件进行配置文件和程序文件的切换,用注解方式,能提高开发的连贯性,和提成开发效率。缺点:程序复杂的话,还是使用xml配置文件的方式,这样可读性和可维护性比较强。(7)参考文献:https://www.cnblogs.com/liuruowang/p/5711563.htmlhttps://blog.csdn.net/qq_16605855/article/details/73465865https://www.cnblogs.com/xuyatao/p/8485851.html百度百科(8)更多讨论:8.1不同切面的通知执行顺序当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。如果需要他们顺序执行,可以通过指定切面的优先级来控制通知的执行顺序。annotation方式:1)@Order(int)指定优先级,例如@Order(1)---->@Order(2)2)也可以通过在切面实现类上实现org.springframework.core.Ordered接口,由private int order 来指定优先级XMl配置方式:可以由aop:aspect的order属性来指定 8.2 AOP使用场景AOP用来封装横切关注点,具体可以在下面的场景中使用:Authentication 权限Caching 缓存Context passing 内容传递Error handling 错误处理Lazy loading懒加载Debugging调试logging, tracing, profiling and monitoring记录跟踪优化校准Performance optimization性能优化Persistence持久化Resource pooling资源池Synchronization同步Transactions 事务 8.3 几个增强之间的区别 除环绕增强外,所有的连接点使用的都是 JoinPoint 类型的入参,而环绕增强使用的是 ProceedingJoinPoint。返回增强能接受到返回值抛出增强能接收到抛出的异常环绕增强的返回值类型为目标方法返回值类型(9)鸣谢:(10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~ PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地