知识大全 Spring AOP 详解
Posted 函数
篇首语:过去并不等于未来,一定会有辉煌的一天,相信自己!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring AOP 详解相关的知识,希望对你有一定的参考价值。
Spring AOP 详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
此前对于AOP的使用仅限于声明式事务 除此之外在实际开发中也没有遇到过与之相关的问题 最近项目中遇到了以下几点需求 仔细思考之后 觉得采用AOP来解决 一方面是为了以更加灵活的方式来解决问题 另一方面是借此机会深入学习SpringAOP相关的内容 本文是权当本人的自己AOP学习笔记 以下需求不用AOP肯定也能解决 至于是否牵强附会 仁者见仁智者见智 对部分函数的调用进行日志记录 用于观察特定问题在运行过程中的函数调用情况 监控部分重要函数 若抛出指定的异常 需要以短信或邮件方式通知相关人员 金控部分重要函数的执行时间 事实上 以上需求没有AOP也能搞定 只是在实现过程中比较郁闷摆了 需要打印日志的函数分散在各个包中 只能找到所有的函数体 手动添加日志 然而这些日志都是临时的 待问题解决之后应该需要清除打印日志的代码 只能再次手动清除^_^! 类似 的情况 需要捕获异常的地方太多 如果手动添加时想到很可能明天又要手动清除 只能再汗 OK 该需求相对比较固定 属于长期监控的范畴 并不需求临时添加后再清除 然而 客户某天要求 把其中 %的异常改为短信提醒 剩下的 %改用邮件提醒 改之 两天后 客户抱怨短信太多 全部改成邮件提醒… 该需求通常用于监控某些函数的执行时间 用以判断系统执行慢的瓶颈所在 瓶颈被解决之后 烦恼同情况 终于下定决心 采用AOP来解决!代码如下 切面类TestAspect [java] package spring aop; /** * 切面 * */ public class TestAspect public void doAfter(JoinPoint jp) System out println( log Ending method: + jp getTarget() getClass() getName() + + jp getSignature() getName()) public Object doAround(ProceedingJoinPoint pjp) throws Throwable long time = System currentTimeMillis() Object retVal = pjp proceed() time = System currentTimeMillis() time; System out println( process time: + time + ms ) return retVal; public void doBefore(JoinPoint jp) System out println( log Begining method: + jp getTarget() getClass() getName() + + jp getSignature() getName()) public void doThrowing(JoinPoint jp Throwable ex) System out println( method + jp getTarget() getClass() getName() + + jp getSignature() getName() + throw exception ) System out println(ex getMessage()) private void sendEx(String ex) //TODO 发送短信或邮件提醒 package spring aop; /** * 切面 * */ public class TestAspect public void doAfter(JoinPoint jp) System out println( log Ending method: + jp getTarget() getClass() getName() + + jp getSignature() getName()) public Object doAround(ProceedingJoinPoint pjp) throws Throwable long time = System currentTimeMillis() Object retVal = pjp proceed() time = System currentTimeMillis() time; System out println( process time: + time + ms ) return retVal; public void doBefore(JoinPoint jp) System out println( log Begining method: + jp getTarget() getClass() getName() + + jp getSignature() getName()) public void doThrowing(JoinPoint jp Throwable ex) System out println( method + jp getTarget() getClass() getName() + + jp getSignature() getName() + throw exception ) System out println(ex getMessage()) private void sendEx(String ex) //TODO 发送短信或邮件提醒 [java] package spring service; /** * 接口A */ public interface AService public void fooA(String _msg) public void barA() package spring service; /** * 接口A */ public interface AService public void fooA(String _msg) public void barA() [java] package spring service; /** *接口A的实现类 */ public class AServiceImpl implements AService public void barA() System out println( AServiceImpl barA() ) public void fooA(String _msg) System out println( AServiceImpl fooA(msg: +_msg+ ) ) package spring service; /** *接口A的实现类 */ public class AServiceImpl implements AService public void barA() System out println( AServiceImpl barA() ) public void fooA(String _msg) System out println( AServiceImpl fooA(msg: +_msg+ ) ) [java] package spring service; /** * Service类B */ public class BServiceImpl public void barB(String _msg int _type) System out println( BServiceImpl barB(msg: +_msg+ type: +_type+ ) )
if(_type == ) throw new IllegalArgumentException( 测试异常 ) public void fooB() System out println( BServiceImpl fooB() ) package spring service; /** * Service类B */ public class BServiceImpl public void barB(String _msg int _type) System out println( BServiceImpl barB(msg: +_msg+ type: +_type+ ) ) if(_type == ) throw new IllegalArgumentException( 测试异常 ) public void fooB() System out println( BServiceImpl fooB() ) ApplicationContext [java] <?xml version= encoding= UTF ?> <beans xmlns= xmlns:xsi= instance xmlns:aop= xsi:schemaLocation= beans xsd aop xsd default autowire= autodetect > <aop:config> <aop:aspect id= TestAspect ref= aspectBean > <! 配置 spring service包下所有类或接口的所有方法 > <aop:pointcut id= businessService expression= execution(* spring service * *()) /> <aop:before pointcut ref= businessService method= doBefore /> <aop:after pointcut ref= businessService method= doAfter /> <aop:around pointcut ref= businessService method= doAround /> <aop:after throwing pointcut ref= businessService method= doThrowing throwing= ex /> </aop:aspect> </aop:config> <bean id= aspectBean class= spring aop TestAspect /> <bean id= aService class= spring service AServiceImpl ></bean> <bean id= bService class= spring service BServiceImpl ></bean> </beans> <?xml version= encoding= UTF ?> <beans xmlns= xmlns:xsi= instance xmlns:aop= xsi:schemaLocation= beans xsd aop xsd default autowire= autodetect > <aop:config> <aop:aspect id= TestAspect ref= aspectBean > <! 配置 spring service包下所有类或接口的所有方法 > <aop:pointcut id= businessService expression= execution(* spring service * *()) /> <aop:before pointcut ref= businessService method= doBefore /> <aop:after pointcut ref= businessService method= doAfter /> <aop:around pointcut ref= businessService method= doAround /> <aop:after throwing pointcut ref= businessService method= doThrowing throwing= ex /> </aop:aspect> </aop:config> <bean id= aspectBean class= spring aop TestAspect /> <bean id= aService class= spring service AServiceImpl ></bean> <bean id= bService class= spring service BServiceImpl ></bean> </beans> 测试类AOPTest [java] public class AOPTest extends AbstractDependencyInjectionSpringContextTests private AService aService; private BServiceImpl bService; protected String[] getConfigLocations() String[] configs = new String[] /applicationContext xml ; return configs; /** * 测试正常调用 */ public void testCall() System out println( SpringTest JUnit test ) aService fooA( JUnit test fooA ) aService barA() bService fooB() bService barB( JUnit test barB ) /** * 测试After Throwing */ public void testThrow() try bService barB( JUnit call barB ) catch (IllegalArgumentException e) public void setAService(AService service) aService = service; public void setBService(BServiceImpl service) bService = service; public class AOPTest extends AbstractDependencyInjectionSpringContextTests private AService aService; private BServiceImpl bService; protected String[] getConfigLocations() String[] configs = new String[] /applicationContext xml ; return configs; /** * 测试正常调用 */ public void testCall() System out println( SpringTest JUnit test ) aService fooA( JUnit test fooA ) aService barA() bService fooB() bService barB( JUnit test barB ) /** * 测试After Throwing */ public void testThrow() try bService barB( JUnit call barB ) catch (IllegalArgumentException e) public void setAService(AService service) aService = service; public void setBService(BServiceImpl service) bService = service; 运行结果如下 [java] log Begining method: spring service AServiceImpl fooA AServiceImpl fooA(msg:JUnit test fooA) log Ending method: spring service AServiceImpl fooA process time: ms log Begining method: spring service AServiceImpl barA AServiceImpl barA() log Ending method: spring service AServiceImpl barA process time: ms log Begining method: spring service BServiceImpl fooB BServiceImpl fooB() log Ending method: spring service BServiceImpl fooB process time: ms log Begining method: spring service BServiceImpl barB BServiceImpl barB(msg:JUnit test barB type: ) log Ending method: spring service BServiceImpl barB process time: ms log Begining method: spring service BServiceImpl barB BServiceImpl barB(msg:JUnit call barB type: ) log Ending method: spring service BServiceImpl barB method spring service BServiceImpl barB throw exception 测试异常 log Begining method: spring service AServiceImpl fooA AServiceImpl fooA(msg:JUnit test fooA) log Ending method: spring service AServiceImpl fooA process time: ms log Begining method: spring service AServiceImpl barA AServiceImpl barA() log Ending method: spring service AServiceImpl barA process time: ms log Begining method: spring service BServiceImpl fooB BServiceImpl fooB() log Ending method: spring service BServiceImpl fooB process time: ms log Begining method: spring service BServiceImpl barB BServiceImpl barB(msg:JUnit test barB type: ) log Ending method: spring service BServiceImpl barB process time: ms log Begining method: spring service BServiceImpl barB BServiceImpl barB(msg:JUnit call barB type: ) log Ending method: spring service BServiceImpl barB method spring service BServiceImpl barB throw exception
cha138/Article/program/Java/ky/201311/28867相关参考
Spring事务处理及其AOP框架的内幕 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ***注
开源技术分析:AOP和Spring事务处理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一为什
Spring3.0中的AOP配置方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第一种配置方
spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理 单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De
问题 问题想要添加日志记录性能监控安全监测 最初解决方案 最初
SpringAOP的一些概念 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 切面(Aspect)
用SpringAOP实现开发中松散耦合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!引言 AOP
用SpringAOP实现松散耦合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs
SpringAOP之HelloWorld 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们使用
Java编程—SpringAOP本质(6) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!