Spring面向切面编程(aop)



Spring面向切面编程(aop)1.图解
Spring面向切面编程(aop)

Spring面向切面编程(aop)
2.实例;
(1)接口

TestServiceInter1.java

package com.ru.aop;
 
public interface TestServiceInter1 {
public void sayhello();
}
TestServiceInter2.java
package com.ru.aop;
 
public interface TestServiceInter2 {
public void saybye();
}
(2)serviceimp业务类 TestService1imp.java

package com.ru.aop;
 
public class TestService1imp implements TestServiceInter1,TestServiceInter2 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
 
 
 
public void sayhello(){
System.out.println(“hello”+name);
}
public void saybye(){
System.out.print(“goodbye”+name);
}
}
 
(3)通知
前置通知

package com.ru.aop;
 
import java.lang.reflect.Method;
 
import org.springframework.aop.MethodBeforeAdvice;
 
public class MethodBeforeFactory implements MethodBeforeAdvice{
 
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println(“代理日志”+arg0.getName());
}
}
后置通知

import java.lang.reflect.Method;
 
import org.springframework.aop.AfterReturningAdvice;
 
public class AfterAdvice implements AfterReturningAdvice {
 
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println(“关闭资源”);
}
 
}
环绕通知

import java.rmi.server.ObjID;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// TODO Auto-generated method stub
System.out.println(“方法调用前”);
Object obj=arg0.proceed();
System.out.println(“方法调用后”);
return obj;
}
}
异常通知

import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class MyThrowAdvice implements ThrowsAdvice {
public void afterThrowing(   
             Method method,   
             Object[] args,   
             Object target,   
             Exception e) {   
System.out.println(method.getName()+”出错了”+e.getMessage());
}
}

(4)beans。xm.l

<!– 配置被代理对象 –>
<bean id=”testService1imp”>
<property name=”name”>
<value>如哥</value>
</property>
</bean>
<bean id=”testService2imp”>
<property name=”name”>
<value>金猛</value>
</property>
</bean>
<!– 配置前置通知 –>
<bean id=”methodbeforeactive”></bean>
<!– 配置后置通知 –>
<bean id=”afteractive”></bean>
<!– 配置环绕通知 –>
<bean id=”MyMethodInterceptor”></bean>
<!– 配置异常通知 –>
<bean id=”myThrowAdvice”></bean>
<!– 配置代理对象 –>
<bean id=”proxyFactoryBean”>
<!– 配置代理接口集 –>
<property name=”proxyInterfaces”>
<list>
<value>com.ru.aop.TestServiceInter1</value>
<value>com.ru.aop.TestServiceInter2</value>
</list>
</property>
<!– 将前置通知织入代理对象 –>
<!– 将后置通知织入代理对象 –>
<property name=”interceptorNames”>
<list>
<value>methodbeforeactive</value>
<value>afteractive</value>
<value>MyMethodInterceptor</value>
<value>myThrowAdvice</value>
</list>
</property>
<!– 配置被代理对象 –>
<property name=”target”>
<ref bean=”testService1imp”/>
</property>
</bean>
(5)test.java

package com.ru.aop;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class test {
 
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ac=new ClassPathXmlApplicationContext(“com/ru/aop/beans.xml”);
TestServiceInter1 ts=(TestServiceInter1) ac.getBean(“proxyFactoryBean”);
ts.sayhello();
((TestServiceInter2)ts).saybye();
}
 
}