加入Spring Aop包
前置通知 (当方法调用时,此时方法还没有被调用)
import org.springframework.aop.MethodBeforeAdvice;
public void before(Method m,Object[] args,Object target);
环绕通知 (方法调用中途)
import org.aopalliance.intercept.MethodInterceptor;
public Object invoke(MethodInvocation invocation);
后置通知 (方法调用结束)
import org.springframework.aop.AfterReturningAdvice;
public void afterReturning(Object returnValue, Method
method,Object[] args, Object target);
异常通知 (发生异常时候)
import org.springframework.aop.ThrowsAdvice;
public void afterThrowing(Method method, Object[] args,
Object target, Exception ex);
以上均为接口,要获得相应的功能支持就需要继承相应的接口,并实现相应的方法
这些是反射机制实现的,因此一般需要导入java.lang.reflect.Method;
下面演示两个例子:
前置通知
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class LogManager implements MethodBeforeAdvice{
public void before(Method m,Object[] args,Object target)
{
System.out.println("before Log!!!");
}
}
异常通知
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class MyThrowsAdvice implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args,
Object target, Exception ex) {
System.out.println("异常发生方法: " + method.getName());
}
}
/**创建一个测试类*/
public class AopDemo implements IAopDemo {//接口
public void doSomething() throws Exception
{
System.out.println("运行doSomething方法....");
//throw new Exception("unkown exception");
}
}
<!-- 前置通知在applicationContext中的配置 -->
<bean id="logAdvice" class="com.sxy.LogManager"></bean>
<!-- 异常捕获 -->
<bean id="myThrowsAdvice " class="com.sxy.MyThrowsAdvice"></bean>
<!-- 测试类对象 -->
<bean id="aopDemoTarget" class="com.lxt008.aop.AopDemo"></bean>
<!-- 增强前置通知,这样可以详细定义应用到方法 -->
<bean id="logAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<constructor-arg>
<ref local="logAdvice" />
</constructor-arg>
<property name="mappedNames">
<list>
<value>doSomething</value>
</list>
</property>
</bean>
<!--程序里使用aopDemo即可-->
<bean id="aopDemo"
<!--代理,功能:整合AopDemo类与通知-->
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<!-- 测试类继承的接口 -->
<value>com.lxt008.aop.IAopDemo</value>
</property>
<property name="interceptorNames">
<!--要应用的通知-->
<list>
<value>logAdvisor</value>
<value>myThrowsAdvice</value>
</list>
</property>
<!--引用的类-->
<property name="target" ref="aopDemoTarget"></property>
</bean>
public static void main(String[] args) {
ApplicationContext ctx=new
ClassPathXmlApplicationContext("applicationContext.xml");
IAopDemo demo=(IAopDemo)ctx.getBean("aopDemo");
demo.doSomething();
}