实例简介:

  这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间。

用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动代理功能,然后一个用Java的动态代理,一个用CGLIB代理。

实现思路:

  首先定义负责异常处理的Advice:ExceptionHandler.java,定义记录程序执行时间的Advice:TimeHandler.java

然后定义业务逻辑接口LogicInterface.java,编写实现业务逻辑接口的类Logic1.java,该业务逻辑在Spring AOP中使用java的动态代理

编写另一个业务逻辑Logic2.java,不实现业务逻辑接口,该业务逻辑在Spring AOP中使用CGLIB代理,然后使用自动代理定义配置文件config.xml

最后编写测试程序,执行并查看输出结果。

1.定义异常处理的Adice:ExceptionHandle.java

 //***ExceptionHandler.java********
package com.gc.action; import java.lang.reflect.Method; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.springframework.aop.ThrowsAdvice; //使用Throw通知类型来实现Advice
public class ExceptionHandler implements ThrowAdvice{
private Logger logger = Logger.getLogger(this.getClass().getName()); public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)throws Throwable{
logger.log(Level.INFO,args[0]+" 执行 "+method.getName()+"时有异常抛出..."+subclass); } }

2.定义记录程序执行时间的Advice为TimeHandler.java

 //***TimeHandler.java*****
package com.gc.action; import org.aopalliance.interceptor.MethodInterceptor;
import org.aopalliance.interceptor.MethodInvocation;
import org.apache.log4j.Level;
import org.apache.log4j.Logger; public class TimeHandler implements MethodInterceptor{
private Logger logger = Logger.getLogger(this.getClass().getName()); public Object invoke(MethodInvocation methodInvocation)throws Throwable{
long procTime = System.currentTimeMillis();
logger.log(Level.INFO,methodInvocation.getArguments()[0]+"开始执行"+methodInvocation.getMethod()+"方法");
}
try{
Object result = methodInvocation.proceed();
return result; }
finally{
procTime = System.currentTimeMillis()-procTime;
logger.log(Level.INFO,methodInvocation.getArguments()[0]+"执行"+methodInvocation.getMethod()+"方法结束");
logger.log(Level.INFO,"执行"+methodInvocation.getMethod.getName()+"方法共用了"+procTime+"毫秒");
}
}

3.定义业务逻辑接口

 //*****LogicInterface.java*****
package com.gc.impl; public interface LogicInterface{
public void doInsert(String name);
public void doUpdate(String name);
public void doDelete(String name); }

4.编写实现业务逻辑接口的类Logic1.java

 //*****Logic2.java******
package com.gc.action; import com.gc.impl.LogicInterface; public class Logic1 implements LogicInterface{
public void doInsert(String name)
{
System.out.println("新增...");
for(int i=0;i<1000000;i++)
{
//模拟执行时间
}
}
public void doUpdate(String name)
{
System.out.println("修改...");
for(int i=0;i<3000000;i++)
{
//模拟执行时间
}
}
public void doDelete(String name)
{
System.out.println("删除...");
for(int i=0;i<2000000;i++)
{
//模拟执行时间
}
} }

5.编写不实现业务逻辑接口的类Logic2.java

  1 //*****Logic2.java******
2 package com.gc.action;
3
4 import com.gc.impl.LogicInterface;
5
6 public class Logic2{
7 public void doInsert(String name)
8 {
9 System.out.println("新增...");
10 for(int i=0;i<4000000;i++)
11 {
12 //模拟执行时间
13 }
14 }
15 public void doUpdate(String name)
16 {
17 System.out.println("修改...");
18 for(int i=0;i<5000000;i++)
19 {
20 //模拟执行时间
21 }
22 }
23 public void doDelete(String name)
24 {
25 System.out.println("删除...");
26 for(int i=0;i<6000000;i++)
27 {
28 //模拟执行时间
29 }
30 }
31
32 }

6.使用自动代理定义配置文件config.xml

 <?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="logic1" class="com.gc.action.Logic1"/>
<bean id="logic2" class="com.gc.action.Logic2"/>
<!--设定自动代理-->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<!--负责记录有异常发生时的信息-->
<bean id="exceptionHandler" class="com.gc.action.ExceptionHandler"/>
<bean id="exceptionHandlerAdvisor" class="org.springframework.support.RegexpMethodPointcutAdvisor"> <property name="advice">
<ref bean="exceptionhandler"/>
</property>
<property name="patterns">
<value>.*.*</value>
</property>
</bean>
<!--负责记录方法的记录时间-->
<bean id="timeHandler" class="com.gc.action.TimeHandler"/>
<bean id="timeHandlerAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="timeHandler"/>
</property>
<property name="patterns">
<value>.*.*</value>
</property>
</bean>
</beans>

7.测试程序

 //***TestLogic1****
package com.gc.test; import org.springframework.context.ApplicationContext;
import org.srpingframework.context.support.FileSystemXmlApplicationContext; import com.gc.impl.LogicInterface; public class TestLogic1{
public static void main(String[] args)throw InstantiationExcetion,IIIegalAccessException,ClassNotFoundException{
ApplicationContext actx = new FileSystemXmlApplicationContext("exception_config.xml");
LogicInterface logic=(LogicInterface)actx.getBean("logic1");
try{
logic.doInsert("张");
logic.doUpdate("王");
logic.doDelete("李");
}
catch(Exception e)
{
}
}
}

Spring AOP实例——异常处理和记录程序执行时间的更多相关文章

  1. Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置

    用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...

  2. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  3. 编程小白入门分享三:Spring AOP统一异常处理

    Spring AOP统一异常处理 简介 在Controller层,Service层,可能会有很多的try catch代码块.这将会严重影响代码的可读性."美观性".怎样才可以把更多 ...

  4. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

  5. Spring aop 实例(转)

    面向切面编程,有效的降低了代码之间的耦合性,易于维护:例如:我们习惯在代码中加上一些日志信息,在程序出错时方便快速查找找到问题,通常做法是在请求进入方法的时候打印日志,退出前打印日志,还有在出错时打印 ...

  6. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  7. Spring学习十四----------Spring AOP实例

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  8. Spring Aop实例

    一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspe ...

  9. Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)

    在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...

随机推荐

  1. lanmp之二 (奇葩问题)

    ps:该篇是接 lanmp -- 动静分离 lanmp -- 奇葩问题 话说,在 搭建 bbs.abc.com (discuz论坛)的 时候.... 1.说明:web机器上以前已经有一个 discuz ...

  2. Git 常用操作和问题解决

    记录一下自己用git作为项目管理过程中常见的错误以及处理方法 1.git pull 出现问题 git pull出现的问题多为远程分支文件和本地冲突 错误提示:error: Your local cha ...

  3. Storyboard & XIB 自己的理解

    //1.storyboard //(1) //此处bundle:nil 等价于 [NSBundle mainBundle] //    SecondViewController *secondVc = ...

  4. JS截取,删除,替换字符串常用方法详细

    删除和替换是一样的,开始用的是,如果是删除就直接替换为空 arr="abc001abc002abc003" arr.replace('abc','123') 结果发现只能替换第一个 ...

  5. Vue.js 快速入门

    什么是Vue.js vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API.作者是尤雨溪,写下这篇文章时vue.js版本为1.0.7 准备 我推荐 ...

  6. Android语录

    1. application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期.因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象.因此在 ...

  7. squid 2.7 配置与安装

    1.准备安装包 2.准备编译环境 yum -y install gcc 3.编译安装squid ./configure \--prefix=/data/squid \--disable-interna ...

  8. Mysql中eft join、right join、inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  9. 使用Jenkins配置Git和Maven的自动化构建

    Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建.自动编译和部署,非常方便. 在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服务器 ...

  10. Oracle连接与会话

    连接(connection):连接是从客户端到oracle数据库实例的一条物理路径. 会话(session):会话是数据库实例中存在的一个逻辑实体. case1:一个连接可以有多个会话 SQL> ...