首先还是一个接口定义:
package
com.gc.impl;
public interface LogicInterface ... {
public void doInsert(String name);
public void doUpdate(String name);
public void doDelete(String name);
}
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;
}
}
}
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;
}
}
}
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);
}
}
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+"毫秒");
}
}
}
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 >
<! 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)
...{
}
}
}
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 从入门到精通>>一书中的一个实例,贴出来供大家参考,也为了备忘,哈哈!!!