spring aop的一个完整实例

首先还是一个接口定义:
package  com.gc.impl;

public   interface  LogicInterface  {

    
public void doInsert(String name);
    
public void doUpdate(String name);
    
public void doDelete(String name);
}

 

接下来是一个实现该接口的具体业务逻辑类:

 

package  com.gc.action;

import  com.gc.impl. * ;

public   class  Logic1  implements  LogicInterface {

    
public void doInsert(String name)
    
{
        
int sum=0;
        System.out.println(
"执行具体负责的新增业务逻辑...");
        
for(int i=0;i<100000;i++)
        
{
            sum
+=i;
        }

    }

    
    
public void doUpdate(String name)
    
{
        
int sum=0;
        System.out.println(
"执行具体负责修改的业务逻辑...");
        
for(int i=0;i<200000;i++)
        
{
            sum
+=i;
        }

    }

    
    
public void doDelete(String name)
    
{
        
        System.out.println(
"负责具体的删除的业务逻辑...");
        
for(int i=0;i<3000;i++)
        
{
            i
=i/0;
        }

    }


    
}

 

然后是一个没有实现接口的具体逻辑类:(主要是为了用来测试cglib代理)

 

package  com.gc.action;

public   class  Logic2  {

    
public void doInsert(String name)
    
{
        
int sum=0;
        System.out.println(
"执行具体负责的新增业务逻辑...");
        
for(int i=0;i<100000;i++)
        
{
            sum
+=i;
        }

    }

    
    
public void doUpdate(String name)
    
{
        
int sum=0;
        System.out.println(
"执行具体负责修改的业务逻辑...");
        
for(int i=0;i<200000;i++)
        
{
            sum
+=i;
        }

    }

    
    
public void doDelete(String name)
    
{
        
        System.out.println(
"负责具体的删除的业务逻辑...");
        
for(int i=0;i<3000;i++)
        
{
            i
=i/0;
        }

    }

}

 

还有就是两个advice:一个是异常advice,一个是around advice:

 

package  com.gc.action;

import  java.lang.reflect.Method;

import  org.springframework.aop.ThrowsAdvice;

public   class  ExceptionHandler  implements  ThrowsAdvice {

    
public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)
    
{
        System.out.println(args[
0]+"执行"+method.getName()+"有异常抛出..."+subclass);
    }

}

 

 

package  com.gc.action;

import  org.aopalliance.intercept.MethodInterceptor;
import  org.aopalliance.intercept.MethodInvocation;

public   class  TimeHandler  implements  MethodInterceptor {

    
public Object invoke(MethodInvocation methodInvocation)throws Throwable
    
{
        
long procTime=System.currentTimeMillis();
        System.out.println(
"开始执行...");
        
try
        
{
            Object result
=methodInvocation.proceed();
            
return result;
        }

        
finally
        
{
            procTime
=System.currentTimeMillis()-procTime;
            System.out.println(
"执行结束..."+"共用了"+procTime+"毫秒");
        }

    }

}

 

然后就是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是没有实现具体接口的,而且下面是设置为自动代理的,所以
          以下的bean使用的是cglib代理,也可以在手工设置代理的时候指定其为cglib代理,代码如下:
          
     <bean id="logic2Proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
       <property name="proxyTargetClass"><value>true</value></property>
       <property name="target"><ref bean="logic2"/></property>
       <property name="interceptorNames">
          <list>
             <value>exceptionHandler</value>
          </list>
       </property>
     </bean>
           
-->
           
  
< bean  id ="logic2"  class ="com.gc.action.Logic2"   />
  
  
< bean  id ="autoProxy"  class ="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"   />
  
  
< bean  id ="exceptionHandler"  class ="com.gc.action.ExceptionHandler"   />
  
< bean  id ="exceptionHandlerAdvisor"  class ="org.springframework.aop.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 >

 

最后当然少不了测试类:

package  com.gc.action;

import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.FileSystemXmlApplicationContext;

import  com.gc.impl.LogicInterface;

public   class  TestAop  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) throws InstantiationException,
    IllegalAccessException,ClassNotFoundException 
    
{
        
// TODO Auto-generated method stub
        ApplicationContext acxt=new FileSystemXmlApplicationContext("exception_config.xml");
        LogicInterface lf
=(LogicInterface)acxt.getBean("logic1");  //这是有用接口的,使用的是java动态代理
        Logic2 l2=(Logic2)acxt.getBean("logic2");                  //这是没用接口的,使用的是cglib代理
        try
        
{
//            lf.doInsert("");
//            lf.doDelete("");
//            lf.doUpdate("");
            
            l2.doDelete(
"");
            l2.doInsert(
"");
            l2.doUpdate(
"");
        }
catch(Exception e)
        
{
            
        }

    }


}

 

以上是我在学习<<spring 从入门到精通>>一书中的一个实例,贴出来供大家参考,也为了备忘,哈哈!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值