测试程序
/**
* fanym版权所有
*/
package com.gc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.gc.action.Logic2;
import com.gc.impl.LogicInterface;
/**
* @author fanym
*
*/
public class TestAop {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext actx=new FileSystemXmlApplicationContext("exception_config.xml");
LogicInterface logic=(LogicInterface)actx.getBean("logic1Proxy");
try {
logic.doInsert("李四");
logic.doUpdate("王五");
logic.doDelete("张三");
} catch (Exception e) {
// TODO: handle exception
}
}
}
exception_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.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>
<bean id="logic1Proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.gc.impl.LogicInterface</value>
</property>
<property name="target">
<ref bean="Logic1"/>
</property>
<!-- 指定要代理的类 -->
<property name="interceptorNames">
<list>
<value>timeHandlerAdvisor</value>
</list>
</property>
</bean>
<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>exceptionHandlerAdvisor</value>
</list>
</property>
</bean>
</beans>
执行时报错:
Exception in thread "main" java.lang.NullPointerException
at com.gc.action.TimeHandler.invoke(TimeHandler.java:24)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy1.isSingleton(Unknown Source)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:278)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:89)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:74)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:65)
at com.gc.test.TestAop.main(TestAop.java:23)
折腾了半个小时后,问题终于发现了,原来在用CGLIB代理时,还设置了spring的aop自动代理,所以,把
<!--设定为自动代理-->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>删掉后,就可以了。
反思:还是基础知识不牢固。