读书人

Spring中的Advice部类及其应用

发布时间: 2013-03-01 18:33:02 作者: rapoo

Spring中的Advice类型及其应用

在Spring中,Advice都是通过Interceptor来实现的,主要有以下几种:

1. 环绕Advice:

//例子摘自Spring referencepublic interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation invocation) throws Throwable;
}
public class DebugInterceptor implements MethodInterceptor {

public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before: invocation=[" + invocation + "]"); //(1)
Object rval = invocation.proceed();
System.out.println("Invocation returned"); //(2)
return rval;
}
}

环绕advice类似一个拦截器链,这个拦截器链的中心就是被拦截的方法。在程序(1)(2)我们可以加入我们自己的代码,以表示在方法执行前后我们需要干什么。invocation.proceed()方法运行指向连接点的拦截器链并返回proceed()的结果。

2. Before Advice

public interface MethodBeforeAdvice extends BeforeAdvice {
void before(Method m, Object[] args, Object target) throws Throwable;
}

一个更简单的通知类型是<?xml version="1.0" encoding="UTF-8"?>
Spring中的Advice部类及其应用<beans xmlns="http://www.springframework.org/schema/beans"
Spring中的Advice部类及其应用 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Spring中的Advice部类及其应用 xmlns:aop="http://www.springframework.org/schema/aop"
Spring中的Advice部类及其应用 xmlns:tx="http://www.springframework.org/schema/tx"
Spring中的Advice部类及其应用 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
Spring中的Advice部类及其应用 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
Spring中的Advice部类及其应用 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
Spring中的Advice部类及其应用
Spring中的Advice部类及其应用 <bean id="loginServiceTarget"
Spring中的Advice部类及其应用 class="com.learn.spring.test.advisor.LoginServiceImpl"/>
Spring中的Advice部类及其应用
Spring中的Advice部类及其应用 <bean id="loginNameCheckInterceptor"
Spring中的Advice部类及其应用 class="com.learn.spring.test.advisor.LoginNameCheckInterceptor"/>
Spring中的Advice部类及其应用 <!--
Spring中的Advice部类及其应用 <bean id="loginCheckInterceptor"
Spring中的Advice部类及其应用 class="com.learn.spring.test.advisor.LoginCheckInterceptor"/>
Spring中的Advice部类及其应用 -->
Spring中的Advice部类及其应用 <bean id="loginCountInterceptor"
Spring中的Advice部类及其应用 class="com.learn.spring.test.advisor.LoginCountInterceptor"/>
Spring中的Advice部类及其应用 <bean id="exceptionThrowInterceptor"
Spring中的Advice部类及其应用 class="com.learn.spring.test.advisor.ExceptionThrowInterceptor"/>
Spring中的Advice部类及其应用
Spring中的Advice部类及其应用 <bean id="loginService" class="org.springframework.aop.framework.ProxyFactoryBean">
Spring中的Advice部类及其应用 <property name="target"><ref local="loginServiceTarget"/></property>
Spring中的Advice部类及其应用 <property name="proxyInterfaces">
Spring中的Advice部类及其应用 <list>
Spring中的Advice部类及其应用 <value>com.learn.spring.test.advisor.LoginService</value>
Spring中的Advice部类及其应用 </list>
Spring中的Advice部类及其应用 </property>
Spring中的Advice部类及其应用 <property name="interceptorNames">
Spring中的Advice部类及其应用 <list>
Spring中的Advice部类及其应用 <value>loginNameCheckInterceptor</value>
Spring中的Advice部类及其应用 <value>loginCountInterceptor</value>
Spring中的Advice部类及其应用 <value>exceptionThrowInterceptor</value>
Spring中的Advice部类及其应用 </list>
Spring中的Advice部类及其应用 </property>
Spring中的Advice部类及其应用 </bean>
Spring中的Advice部类及其应用</beans>

测试代码运行:

public class Test {

public static void main(String[] args) throws Exception {
BeanFactory bf =
BeanFactoryFactory.getBeanFactory("beans.xml", Test.class);
LoginService ls = (LoginService) bf.getBean("loginService");
ls.login("myyate", "pass");
}
}

输出结果:

check user's name is valid?
myyate passed check....
myyate is logining system...
Counting the login counts of myyate

读书人网 >Web前端

热点推荐