传统AOP实现


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,完成方法的增强
实现MethodBeforeAdvice,AfterReturningAdvice,MethodInterceptor,ThrowsAdvice等接口
MethodBeforeAdvice,? 在方法调用前执行 before( Method m, Object[] arg1, Object arg2)
AfterReturningAdvice, 在方法调用后执行 afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3)
MethodInterceptor,在process()前后执行,invoke(MethodInvocation mi)
ThrowsAdvice 当方法抛出异常时执行,afterThrowing(Exception ex)

public class LoginBeforeAop implements MethodBeforeAdvice,AfterReturningAdvice,MethodInterceptor {

public void before( Method m, Object[] arg1, Object arg2)
throws Throwable {
System.out.println( m.getName() + ” ” + ” before ———— ” );

}

public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println(? ” end ———— ” );
}

public Object invoke(MethodInvocation mi) throws Throwable {
//在方法执行前最早执行,在方法执行后最后执行
// TODO Auto-generated method stub
System.out.println(“method “+mi.getMethod()+” is called on “+ mi.getThis()+” with args “+(mi.getArguments()));
Object ret = mi.proceed();
System.out.println( “methodInterceptor after “);
return ret;?? //注:若没有返回ret,调用会出错
}

2,实现自己的业务类与相应的接口,抽象类等。
如: LoginDaoInf,? LoginDaoAbst,? LoginDaoImpl,????

3, 将增强与业务类对应起来

在applicationContext.xml中配置:??
//业务类
<bean id=”loginDaoImpl”></bean>
//增强类
<bean id=”loginDaoAD”></bean>

//业务类与增强类装配
<bean id=”loginDaoInf”>
//指定业务类
<property name=”target” ref = “loginDaoImpl” />
//指定增强
<property name=”interceptorNames”>
<list>
<value>loginDaoAD</value>? //注,可指定多个增强
</list>
</property>
</bean>???

注: (1) 对指定的方法应用增强。? 实现方式:增强advisor配置
上述的配置方法会对一特定类的所有方法进行增强,若想对该类指定的方法进行增强,要配置一个advisor
让它包含advice,之后在业务类与增强类装配时用advisor代替advice即可。
??? (advice 建议,advisor顾问,建议高级形式就是顾问)

配置时class为NameMatchMethodPointcutAdvisor
<bean id=”loginDaoADR”>
<property name = “mappedNames” >
<list>
<value>check*</value>
<value>show</value>
??????????????? //对类以check开头的方法及show方法应用增强,增强用advice property指定,而是哪个类则
??????????????? //要在装配时才能确定。
</list>
</property>
<property name=”advice” ref=”loginDaoAD”></property>? //可看出:advisor = adivce + poingcut
</bean>

(2) 对指定的多个类一次指定增强。??? 实现方式:改变增强与业务类的装配方式。

1) BeanNameAutoProxyCreator方式

<bean id=”loginDaoInf”>
<bean id=”AllAuto”>
??? <property name=”beanNames” >
??????? <list>??????????????????? //指定为哪些类应用增强
??????????? <value>*DaoInf</value>
??????? </list>
??? </property>
??? <property name=”interceptorNames”>
??????? <list>????????????????? //指定应用的增强,advice或advisor
??????????? <value>loginDaoAD</value>
??????? </list>
??? </property>
</bean>

(3)自动对bean应用适合的增强(查找增强时只查找advisor,不用advice,因advice不能指定方法),即当bean方法若out()执行时,就在配置文件中的所有advisor中查找,若advisor有针对out方法的配置,如:
????????????? <property name = “mappedNames” >
??????????????????????? <list>
????????????????????????????? <value>out</value>
?????????????????????? </list
?????????????? </property>
就对此方法应用增强。

这种自动增强增强的实现方式如下:
在配置文件中加入:
<bean id=”autoProxyCreator”
??>
</bean>
就自动完成方法增强的侦测!