SpringAOP面向切面编程
Spring中三大核心思想之一AOP(面向切面编程):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<!-- 定义bean -->
<bean id="stuService" class="com.lxit.aop.service.StudentService" />
<!-- AOP配置 -->
<!-- 添加Aspect的bean -->
<bean id="logAspect" class="com.lxit.aop.aspect.LogAspect" />
<aop:config>
<!-- 定义一个pointcut -->
<aop:pointcut id="servicepointcut"
expression="execution(* com.lxit.aop.service.*.*(..))" />
<!-- 定义aspect,引用生成的aspectBean 并指定pointcut 和 method-->
<aop:aspect id="aspect1" ref="logAspect">
<aop:after pointcut-ref="servicepointcut" method="logAdd" />
</aop:aspect>
</aop:config>
</beans>
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("spring.xml");
StudentService service = (StudentService) ac.getBean("stuService");
service.add();
service.getStudent();
}
异常抛出增强:
异常抛出增强的特点是在目标方法抛出异常时织入增强处理,
但是异常处理一般会需要获取异常参数。
在配置文件中添加异常处理的aspect。
使用<aop:after-throwing来进行异常织入。
public class ExceptionAspect {
public void exceptionLog(Exception e){
System.out.println("发生异常,写入日志。" + e.getMessage());
}
}
<bean id="exceptionAspect" class="com.lxit.aop.aspect.ExceptionAspect" />
<aop:config>
<!-- 定义一个pointcut -->
<aop:pointcut id="servicepointcut"
expression="execution(* com.lxit.aop.service.*.*(..))" />
<!-- 定义aspect,引用生成的aspectBean 并指定pointcut 和 method-->
<aop:aspect id="aspect2" ref="exceptionAspect">
<!-- 表示当程序发生异常后才织入 -->
<aop:after-throwing method="exceptionLog"
pointcut-ref="servicepointcut" throwing="e"/>
</aop:aspect>
</aop:config>
环绕增强:
环绕增强在目标方法的前后都可以织入增强处理
环绕增强是功能最强大的增强处理,Spring把目标方法的控制权全部交给了它
在环绕增强处理中,可以获取或修改目标方法的参数、返回值,可以对它进行异常处理,甚至可以决定目标方法是否执行
public class AroundLogger {
public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { … }
}
<bean id="theLogger" class="aop. AroundLogger"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* biz.IUserBiz.*(..))" />
<aop:aspect ref="theLogger">
<aop:around method="aroundLogger" pointcut-ref="pointcut" />
</aop:aspect>
</aop:config>
五中织入方式的区别:
<aop:before …>:在目标方法调用之前织入。
只要before方法执行完成,目标方法总会被调用,但before可以通过抛出异常来阻止目标方法执行,before不能访问目标方法的返回值。
<aop:after…>:在目标方法调用之后织入。
after不能组织目标方法的执行,after不能访问目标方法的返回值。
<aop:after-throwing..>:抛出异常时织入。如果指定throwing必须指定一个异常参数,增强方法中必须和此参数同名,类型必须大于该异常类型。
<aop:after-returning…>:在目标方法成功执行之后织入。
after-returning:不能阻止目标方法的执行,可以访问目标方法的返回值,但不能修改。
<aop:around…>:在目标方法调用之前和调用之后织入。它的处理方法必须包含一个ProceedingJoinPoint形参。
aop:around:可以组织目标方法的执行,可以访问目标方法的返回值,可以修改返回值。
以上增强器都可以指定args来指定参数
在Struts2,hibernate,Spring整合中就可以看到一种很好的效果。
在serivce层定义成一个切点在执行操作前可以开启一系列操作,比如写入日志,事务等操作是一种典型的案例。
AOP使用场景
AOP用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 懒加载
Debugging 调试 logging, tracing, profiling and monitoring 记录跟踪 优化 校准 Performance optimization 性能优化
Persistence 持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务
SpringAOP面向切面编程的更多相关文章
- JavaWeb_(Spring框架)SpringAOP面向切面编程
SpringAOP:面向切面编程(面向fifter编程) 通俗易懂术语:所有纵向重复的代码,我们提取成横向的代码 以下文章内容参考知乎:从0带你学习SpringAOP,彻底的理解AOP思想 传送门 1 ...
- SpringAOP 面向切面编程
AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...
- Spring-AOP面向切面编程
AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...
- 了解并使用springAOP(面向切面编程)
Aop是干嘛的为什么要使用它 在业务系统中,总有一些散落,渗透到系统的各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称切面, 我们怎样才不受这些附加要求的干扰,专心于真正 ...
- Spring--AOP(面向切面)编程
AOP 切面就像一把菜刀,将Java处理业务流程进行分割,在分割处添加特定的业务处理.主要应用于声明事务.安全和缓存.在本文中,主要介绍两种切面的实现方法--Java配置和XML配置. Java配置 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- spring入门(四)【面向切面编程】
开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
- Spring面向切面编程(AOP)
1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...
随机推荐
- 牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
题目链接 这个题,一眼看上去就是最短路的题,边权有负环显然不能用dij,然后出题人又卡了spfa,,那怎么办的想点办法啊,好像还有一个拓扑排序可以求最短路吧,这时候正解就已经得到了,就是拓扑排序求最短 ...
- 【vue】中 $parent 和 $children 的使用方法
<div id="app"> A{{msg}} <my-button :msg="msg"></my-button> < ...
- Python 13 简单项目-堡垒机
本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...
- centos 6.8下载地址
centos6.8校验码查询网站:https://wiki.centos.org/zh-tw/Manuals/ReleaseNotes/CentOS6.8 CentOS 6.8 64位DVD 种子下载 ...
- ionic编译安卓App
安装node.js 安装Android Studio 运行Android Studio安装SDK,在D:\AndroidSDK 配置SDK环境 ANDROID_HOME=D:\AndroidSDK P ...
- python第l六天,lambda表达式学习,涉及filter及Map。
在python中lambda表达式可以作为匿名函数来使用,举一个简单的栗子: 以前我们写两个数相加的函数需要 #以前我们写两个数相加的函数,需要这样写 >>> def sum(x,y ...
- C++虚函数总结
为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚 ...
- 使用SpringSocial开发QQ登录
⒈编写QQ用户对应的数据结构 package cn.coreqi.social.qq.entities; /** * 封装QQ的用户信息 */ public class QQUserInfo { /* ...
- 【ARTS】01_16_左耳听风-20190225~20190303
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 记录 一次深夜救火:datanode.data.dir
火灾背景: Hadoop集群,4个节点,每一台配置都不一样 火灾现场: 1.突然发现DN4硬盘报警,检查硬盘,发现挂载如下: /home 200GB /home/data 3TB 然后发现datano ...