Spring 一二事(9) - xml 形式的 AOP
AOP在spring中是非常重要的一个
在切面类中,有5种通知类型:
aop:before 前置通知
aop:after-returning 后置通知
aop:after 最终通知
aop:after-throwing 异常通知
aop:around 环绕通知
<bean id="personDAO" class="com.lee.spring002.aop.xml.PersonDAOImpl"></bean>
<bean id="transaction" class="com.lee.spring002.aop.xml.Transaction"></bean> <aop:config >
<!-- 切入点表达式,作用:确定目标类 -->
<!-- spring 会自动检测这个表达式下的类是否是切面,如果是,则不会包含进来 -->
<aop:pointcut expression="execution(* com.lee.spring002.aop.xml.PersonDAOImpl.*(..))" id="perform"/>
<!-- ref 指向切面 -->
<aop:aspect ref="transaction">
<!-- 前置通知 -->
<aop:before method="beginTransaction" pointcut-ref="perform"/> <!--
后置通知
可以获取目标方法的返回值(前置方法获取不到)
如果目标方法抛出异常,后置通知则不会继续执行
-->
<aop:after-returning method="commit" pointcut-ref="perform" returning="val"/> <!--
最终通知
无论目标方法是否抛出异常都将执行此方法
-->
<aop:after method="finallyDisplay" pointcut-ref="perform"/> <!--
异常通知
-->
<aop:after-throwing method="exception" pointcut-ref="perform" throwing="content"/> <!--
环绕通知
能控制目标方法能否执行
前置通知和后置通知能在目标方法的前后加代码,但是不能控制方法的执行
-->
<aop:around method="arround" pointcut-ref="perform"/>
</aop:aspect>
</aop:config>
关于切面的表达式简单说一下:
- 任意公共方法的执行:
execution(public * *(..))
- 任何一个名字以“set”开始的方法的执行:
execution(* set*(..))
AccountService接口定义的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
- 在service包中定义的任意方法的执行:
execution(* com.xyz.service.*.*(..))
- 在service包或其子包中定义的任意方法的执行:
execution(* com.xyz.service..*.*(..))
IPersonDAO.java
package com.lee.spring002.aop.xml;
public interface IPersonDAO {
public String savePerson();
}
PersonDAOImpl.java
package com.lee.spring002.aop.xml;
public class PersonDAOImpl implements IPersonDAO {
@Override
public String savePerson() {
System.out.println("PersonDAOImpl - savePerson()");
// int a = 1 / 0;
return "save successfully";
}
}
Transaction.java
package com.lee.spring002.aop.xml; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; /**
* 这是个切面
*
* @author leechenxiang
* @date 2016年1月12日
*
*/
public class Transaction { public void beginTransaction(JoinPoint jp) {
System.out.println("连接点名称: " + jp.getSignature().getName());
System.out.println("目标类名称: " + jp.getTarget().getClass());
System.out.println("Begin transaction...");
} /**
*
* @param jp
* @param val 目标方法返回值,要与returning对应
*/
public void commit(JoinPoint jp, Object val) {
System.out.println("Transaction commit..."); System.out.println("returning: " + val.toString());
} public void finallyDisplay() {
System.out.println("finally...");
} public void exception(JoinPoint jp, Throwable content) {
System.out.println("exception: " + content);
System.out.println("exception: " + content.getMessage());
} public void arround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("arround...");
pjp.proceed(); // 调用目标方法,如果这行不写,则目标方法不执行
}
}
测试:
package com.lee.spring002.aop.xml; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TransactionTest { /**
* 原理:
* 1、当spring容器启动的时候,加载两个bean,对两个bean进行实例化
* 2、当spring容器对配置文件解析到<aop:config>的时候
* 3、把切入点表达式解析出来,按照切入点表达式匹配spring容器内容的bean
* 4、如果匹配成功,则为该bean创建代理对象
* 5、当客户端利用context.getBean获取一个对象时,如果该对象有代理对象,则返回代理对象
* 如果没有代理对象,则返回对象本身
*/
@Test
public void testPerson() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IPersonDAO personDAO = (IPersonDAO)context.getBean("personDAO");
personDAO.savePerson();
} }
github地址:https://github.com/leechenxiang/maven-spring002-aop
Spring 一二事(9) - xml 形式的 AOP的更多相关文章
- Spring 一二事(10) - annotation AOP
先贴出POM的内容,这个毕竟是用的maven来简单构建的 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...
- Spring 一二事(8) - annotation 形式的 MVC
<!-- component:把一个类放入到spring容器中,该类就是一个component 在base-package指定的包及子包下扫描所有的类 --> <context:co ...
- [原创]java WEB学习笔记108:Spring学习---基于配置文件的形式实现AOP
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring 一二事(7) - annotation
之前的文章大多都是一带而过,一方面比较简单,一方面不是用的注解形式 在企业开发中,主要还是使用的注解来进行开发的 1 <!-- component:把一个类放入到spring容器中,该类就是一个 ...
- Spring 一二事(4) - 单例
spring bean配置后再默认情况下是单例的,如果需要配置可以选择 prototype, request, session和global session 在配置spring mvc的action时 ...
- Spring 一二事(1)
简单介绍一下spring,一方面带新手入入门,一方面自己也重温一下第一个小工厂先暂时不用maven,下一个会用maven来来配置 jar包只需要一个,spring版本为2.5(暂时为2.5,后续更新, ...
- Spring 一二事(5) - 依赖注入
<!-- 依赖注入的装配过程 --> <bean id="person" class="com.lee.spring007.di.xml.setter. ...
- Spring 一二事(2)
静态工厂方法及实例工厂的使用: applicationContext.xml: <!-- factory-method 是指调用静态工厂方法 --> <bean id="h ...
- Spring 一二事(6) - IOC MVC 简易搭建
<bean id="personAction" class="com.lee.spring008.IOC.DI.MVC.PersonAction"> ...
随机推荐
- 【Javascript Demo】谷歌地图简单实现(附遮罩层和弹出层实现)
虽然百度地图实现了,但只是国内的,而且前几天貌似还出问题了,对于国际的只能用谷歌地图了,所以就简单研究了下,做了个差不多的. 基本步骤,谷歌地图API文档其实写的很清楚了,先获取API密钥,然后引用j ...
- -Prefix.pch has been modified 的错误修复
方法一: 选择 Product > Clean 然后重新编译--运行: 方法二: 找到-Prefix.pch文件,把中间的 #ifdef __OBJC__ #import <UIKit/U ...
- SVN、TortoiseSVN相关问题
主要记录一些日常操作出现的问题: 1.upgrade working copy: SVN客户端升级或降级的时候,在本地已经下载workspace右键会显示upgrade working copy. 无 ...
- 替换 ionic 中的 图标
第一步,你把你的项目的SVG文件跟你自己做的图标的SVG文件都上到icomoon.io/app(上传方式上节已经讲过了,不会的翻下上节内容),会看到这么界面 第二步,点击下载后,出现这个页面,修改前缀 ...
- ci高级使用方法篇之连接多个数据库
在我们的项目中有时可能须要连接不止一个数据库.在ci中怎样实现呢? 我们在本地新建了两个数据库,例如以下截图所看到的: 改动配置文件database.php文件为例如以下格式(读者依据自己数据库的情况 ...
- 【Linux】在Linux上查看并替换特殊字符
现有windows上新建的一个txt文件file01.txt,内容如下: 我们通过ftp上传到Linux,在Linux下使用命令cat –A file01.txt查看文件内容发现该文件的结尾全是^M$ ...
- 调用网易有道词典api
# -*- coding: utf-8 -*- #python 27 #xiaodeng #调用网易有道词典api import urllib import json class Youdao(): ...
- linux脚本加密shc
linxu的shell脚本看下源码,都能明白含义.加密也是很关键的 01.安装shc加密 http://www.datsi.fi.upm.es/~frosal/sources/ ###下载源码 百 ...
- [SceneKit] 不会 Unity3D 的另一种选择
概述 SceneKit和SpriteKit的区别简单的来说就是二维和三维的区别 详细 代码下载:http://www.demodashi.com/demo/10664.html 上周一, 相信很多人和 ...
- 【mysql+RBAC】RBAC权限处理(转载:http://www.cnblogs.com/xiaoxi/p/5889486.html 平凡希)
1.这里我只讲核心,mysql查询语句:FIND_IN_SET(str,strlist) 2.具体教程可以参考[童攀老师的RBAC],很清晰,赞一个. 3.详解:mysql的find_in_set 首 ...