由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施。完成学习的小例子。

关于spring-Aop原理:http://m.oschina.net/blog/174838这篇文章写的非常好。

个人觉着可能上线的时候配置文件更方便一下。所以样例主要是配置文件方式

Demo文件下载地址:

http://download.csdn.net/detail/ruishenh/7261121

Spring配置文件

/idle-service-impl/src/main/resources/spring/app-config.xml

<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.2.xsd"> <context:component-scanbase-package="com.ruishenh.business.impl" />
<aop:aspectj-autoproxyexpose-proxy="true" proxy-target-class="true"/>
<context:annotation-config/>
<!-- -->
<beanid="springFactoryUtil"class="com.ruishenh.utils.SpringFactoryUtil" />
<!-- -->
<importresource="aop-advisor.xml" />
</beans>

导入的aop-advisor.xml文件

/idle-service-impl/src/main/resources/spring/aop-advisor.xml

<?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"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.1.xsd"> <bean id="genericAdvisor" class="com.ruishenh.aop.aspect.advisor.GenericAdvisor"/>
<aop:config>
<!-- 定义切面 -->
<aop:aspect ref="genericAdvisor" order="0">
<!-- 定义连接点 -->
<aop:pointcut id="businessService" expression="execution(*com.ruishenh.business.impl..*.*(..))" />
<!-- 定义前置 -->
<aop:before method="before" pointcut-ref="businessService"/>
<!-- 定义围绕 -->
<aop:around method="heartbeat" pointcut-ref="businessService"/>
<!-- 定义后置 -->
<aop:after method="after" pointcut-ref="businessService"/>
<!-- 定义Target处理后普通结果增强 -->
<aop:after-returning method="afterReturning" pointcut-ref="businessService" returning="obj"/>
<!-- 定义Target处理后异常增强 -->
<aop:after-throwing method="handlerException" pointcut-ref="businessService" throwing="e"/> </aop:aspect>
</aop:config>
</beans>

关于这个类

com.ruishenh.aop.aspect.advisor.GenericAdvisor中方法有

 

1.  before  相应Target运行之前

2.  heartbeat这个是围绕的一个方法

3.  after  相应target运行之后

4.  afterReturning 相应在target处理后结果返回增强处理

5.        handlerException 相应在target运行异常时增强处理

/idle-service-impl/src/main/java/com/ruishenh/aop/aspect/advisor/GenericAdvisor.java源代码

package com.ruishenh.aop.aspect.advisor;

import org.aspectj.lang.JoinPoint;
importorg.aspectj.lang.ProceedingJoinPoint; import com.ruishenh.domain.account.AccountBank; public class GenericAdvisor { /**
* 对于要增强的方法。运行围绕处理检查心跳是否正常
* @param joinPoint
* @return
* @throws Throwable
*/
Objectheartbeat(ProceedingJoinPoint joinPoint) throws Throwable{ // if(checkHeartbeat()) {
//
// }
System.out.println("2joinPoint.Signature.name:"+joinPoint.getSignature().getName());
//记得在调用运行方法的时候异常不要try-catch,要thrwos出去,不然可能事务层没法起效,或者增强异常处理也无法起效
Objectobj=joinPoint.proceed();
//下边的參入參数能够改动。可是类型和方法的个数要和原来一致,不然原方法无法运行
// Objectobj=joinPoint.proceed(joinPoint.getArgs()); //对于返回后对象,有可能要做处理,对返回參数的某一些值处理,
//能够通过org.springframework.beans.BeanUtils.copyProperties把一些值赋值
if(obj==null) {
returnnew AccountBank();
}
returnobj;
}
/**
* 对于要增强的方法,在方法之前运行
* @param joinPoint 连接点信息
*/
voidbefore(JoinPoint joinPoint){
Object[] objs=joinPoint.getArgs();
System.out.println("1objs:"+objs[0]);
System.out.println("1joinPoint:"+joinPoint);
}; /**
* 对于要增强的方法,在方法之后运行
* @param joinPoint 连接点信息
*/
voidafter(JoinPoint joinPoint){
Object[] objs=joinPoint.getArgs();
System.out.println("4objs:"+objs[0]);
System.out.println("4joinPoint:"+joinPoint);
};
/**
* 对于要添加的方法,方法返回结果后。对结果进行记录或者分析
* 方法
* @param obj target运行后返回的结果
*/
voidafterReturning(Object obj){
System.out.println("3obj:"+obj);
};
/**
* 对于要增强的方法,方法抛出异常后。对异常的增强处理,比方记录异常。或者依据异常分析数据什么的
* @param e target运行后抛出的异常
*/
voidhandlerException(Throwable e){
System.out.println("handingException......");
e.printStackTrace();
} booleancheckHeartbeat(){
returntrue;
}
}

Junit測试

/idle-service-impl/src/test/java/com/ruishenh/business/impl/account/AccountServiceImplTest.java

package com.ruishenh.business.impl.account;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
importorg.springframework.test.context.ContextConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner; importcom.ruishenh.domain.account.AccountBank;
importcom.ruishenh.domain.account.AccountBankParam;
import com.ruishenh.utils.SpringFactoryUtil; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring/app-config.xml"})
public class AccountServiceImplTest { @Before
publicvoid setUp() throws Exception {
} @Test
publicvoid testStoreIn() throws Exception {
AccountServiceImplimpl= SpringFactoryUtil.getBean(AccountServiceImpl.class);
AccountBankParamparam= new AccountBankParam();
param.setId(100);
AccountBankab=impl.storeIn(param);
System.out.println(ab.toString());
} }

运行后输出结果:

1objs:com.ruishenh.domain.account.AccountBankParam@d522de2[id=100,name=<null>,account=<null>]

1joinPoint:execution(AccountBankcom.ruishenh.business.impl.account.AccountServiceImpl.storeIn(AccountBankParam))

2joinPoint.Signature.name:storeIn

==============todo=====================

4objs:com.ruishenh.domain.account.AccountBankParam@d522de2[id=100,name=<null>,account=<null>]

4joinPoint:execution(AccountBankcom.ruishenh.business.impl.account.AccountServiceImpl.storeIn(AccountBankParam))

3obj:com.ruishenh.domain.account.AccountBank@2d397e5c[id=0,name=<null>,account=<null>]

com.ruishenh.domain.account.AccountBank@2d397e5c[id=0,name=<null>,account=<null>]

版权声明:本文博主原创文章,博客,未经同意不得转载。

Spring aop 小例子demo的更多相关文章

  1. SSH框架系列:Spring AOP应用记录日志Demo

    分类: [java]2013-12-10 18:53 724人阅读 评论(0) 收藏 举报 1.简介 Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编 ...

  2. Spring AOP应用实例demo

    AOP(Aspect-Oriented Programming.面向方面编程).能够说是OOP(Object-OrientedPrograming.面向对象编程)的补充和完好.OOP引入封装.继承和多 ...

  3. Spring AOP 学习例子

    http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example     工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大 ...

  4. Spring AOP实战例子与springmvc整合不起效果的解决办法

    在使用AOP之前,首先我们先了解一下什么是AOP吧.在网上很多人将AOP翻译为“面向切面编程”,什么是面向切面?与面向对象有什么区别呢? 在回答这两个问题之前,我们先要明白切面的概念. 切面由切点与增 ...

  5. spring Aop的一个demo

    面向切面是什么我就不说了. 上代码: package com.foreveross.service.weixin.test; import java.lang.annotation.Documente ...

  6. spring aop 的一个demo(未完,待完善)

    假设我们有这样的一个场景 : 对于一个类的众多方法,有些方法需要从缓存读取数据,有些则需要直接从数据库读取数据.怎样实现呢? 实现方案有多种.下面我说下常见的几种实现方案 : 1.直接采用spring ...

  7. mybatis 不整合spring 入门小例子

    先上一个搭建完的项目结构截图: 相对比较重要的配置文件有 db.properties , SqlMappingConfig.xml , mapper/User.xml , log4j.properti ...

  8. Spring AOP注解配置demo

    https://blog.csdn.net/yhl_jxy/article/details/78815636#commentBox

  9. c# spring aop的简单例子

    刚刚完成了一个c#的spring aop简单例子,是在mac下用Xamarin Studio开发的.代码如下: 接口 using System; using System.Collections.Ge ...

随机推荐

  1. windows phone (17) ManipulationDelta事件

    原文:windows phone (17) ManipulationDelta事件 ManipulationDelta事件会是在触摸位置发生变化是引发,比如可以根据用户在触摸屏中移动的位置,图片发生相 ...

  2. C++使用函数模板

    函数模板: 函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员. 第一次使用时,新的功能是创建.从功能模板生成的函数的实例称为模板或模板的实例.函数模板的开始是keywordtemplate ...

  3. android学习七(创建自己定义控件)

    前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...

  4. Unity3D之Vector3.Dot和Vector3.Cross采用

    在Unity3D中.Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积.   点积计算的结果为数值,而叉积计算的结果为向量.两者要注意差别开来.   在几何数学 ...

  5. svn 使用(一个)

    一个. 安装svn  server(操作系统centos) yum install subversion 通过 subversion -v 如果成功安装命令来查看 温馨提示不承担任何subversio ...

  6. 《Linux Device Drivers》 第十七章 网络驱动程序——note

    基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...

  7. VS2010程序打包操作

    摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html   1.  在vs2010 选择“新建项目”----“其他项目类型”-- ...

  8. Directx11学习笔记【十八】 Blending混合

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5634580.html 在d3d11中是按frame来渲染物体的,在 ...

  9. Android搜索芽发展clientVersion1.0结束(过程和结果显示)

    本文原:http://blog.csdn.net/minimicall 转载标明. 博士生.找我,我希望有一个合作伙伴.为了帮助他解决了移动终端产品.他给了我他的想法的叙述性说明,搜索布.要搜索布图像 ...

  10. Channel Allocation (poj 1129 dfs)

    Language: Default Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12 ...