您的位置:首页 > 编程语言 > Java开发

Spring的面向方面编程(Aop)

2008-11-10 22:18 645 查看
加入Spring Aop包<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

前置通知 (当方法调用时,此时方法还没有被调用)

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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息