知识大全 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框架的内幕

Spring事务处理及其AOP框架的内幕  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ***注

知识大全 开源技术分析:AOP和Spring事务处理

开源技术分析:AOP和Spring事务处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什

知识大全 Spring3.0中的AOP配置方法

Spring3.0中的AOP配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一种配置方

知识大全 spring aop中单独代理和自动代理的设置

  spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理  单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De

知识大全 对spring的aop理解

   问题   问题想要添加日志记录性能监控安全监测   最初解决方案   最初

知识大全 Spring AOP的一些概念

SpringAOP的一些概念  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  切面(Aspect)

知识大全 用Spring AOP实现开发中松散耦合

用SpringAOP实现开发中松散耦合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!引言  AOP

知识大全 用Spring AOP实现松散耦合

用SpringAOP实现松散耦合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 Spring AOP之Hello World

SpringAOP之HelloWorld  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们使用

知识大全 Java编程—Spring AOP本质(6)

Java编程—SpringAOP本质(6)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!