本文共 4618 字,大约阅读时间需要 15 分钟。
AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充! 还是拿人家经常举的一个例子讲解一下吧: 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录, 我们写个例子看看我们最简单的解决方案 EmpService接口 package cn.csdn.service; public interface EmpService { void work(String name); } 实现类 package cn.csdn.service; public class EmpServiceImpl implements EmpService { private String worktime; public EmpServiceImpl() { } public void setWorktime(String worktime) { this.worktime = worktime; } @Override public void work(String name) { /** * String str = null; str.toString(); **/ System.out.println(worktime + " ===" + name); } } 前置通知写法 package cn.csdn.aop.advice; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; /**前置通知(方法执行之前)*/ public class MyBeforeAdvice implements MethodBeforeAdvice{ /**第一个参数是:方法 * 第二个参数是:方法的参数 * 第三个参数是:目标对象*/ @Override public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { System.out.println("方法的名称是:"+arg0); System.out.println("方法的参数"+arg1.length+arg1[0]); System.out.println("目标对象"+arg2); } } 后置通知写法 package cn.csdn.aop.advice; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; /**后置通知(方法执行之后)*/ public class MyAfterAdvice implements AfterReturningAdvice { @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("方法的返回类型:"+arg0); System.out.println("方法的名称"+arg1+"方法的参数:"+arg2.length+"目标对象:"+arg3.getClass().getName()); } } 环绕通知 package cn.csdn.aop.advice; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /**环绕通知(方法执行前后)*/ public class MyAroundAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("around start"); Object obj = invocation.proceed();// 让它去执行目标方法 System.out.println("around end"); return obj; } } 异常通知写法 package cn.csdn.aop.advice; import java.lang.reflect.Method; import org.springframework.aop.ThrowsAdvice; /** * 异常通知(方法产生bug)*/ public class MyException implements ThrowsAdvice{ /**写方法的时候一定参考API中的方法样式 不能够随意写*/ public void afterThrowing(Method method, Object[] args, Object target, Exception ex){ System.out.println("方法的名称:"+method+"方法的参数"+args.length+"目标对象:"+target.getClass().getName()+"异常"+ex.getMessage()); } } 配置文件写法 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- 前置通知(方法操作之前进行处理) --> <bean id="myBeforeAdvice" class="cn.csdn.aop.advice.MyBeforeAdvice" scope="singleton" /> <!-- 后置通知(方法的操作之后进行处理) --> <bean id="myAfterAdvice" class="cn.csdn.aop.advice.MyAfterAdvice" scope="singleton"/> <!-- 环绕通知(方法执行前后处理) --> <bean id="myAroundAdvice" class="cn.csdn.aop.advice.MyAroundAdvice" scope="singleton"/> <!-- 异常通知(方法执行期间出现bug的时候) --> <bean id="myException" class="cn.csdn.aop.advice.MyException" scope="singleton"/> <!-- 目标对象 --> <bean id="empServiceTarget" class="cn.csdn.service.EmpServiceImpl"> <property name="worktime"> <value>8小时</value> </property> </bean> <!-- 代理对象 --> <bean id="proxyEmpService" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 代理的接口 --> <property name="proxyInterfaces"> <list> <value>cn.csdn.service.EmpService</value> </list> </property> <!-- 代理 拦截通知的集合--> <property name="interceptorNames"> <list> <value>myBeforeAdvice</value> <value>myAfterAdvice</value> <value>myAroundAdvice</value> <value>myException</value> </list> </property> <!-- 代理 拦截通知的集合 --> <property name="interceptorNames"> <list> <value>slpbeforeAdivce</value> <value>myAfterAdvice</value> <value>wkAroundAdivce</value> <value>myException</value> <value>defaultIntroductionAdvisor</value> </list> </property> <!-- 指明目标对象 --> <property name="target"> <ref bean="empServiceTarget" /> </property> </bean> </beans> 测试类 package cn.csdn.service; import java.sql.Date; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { @Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext( "classpath:app*.xml"); EmpService empService = (EmpService) ac.getBean("proxyEmpService"); empService.work("ss"); } } 输出信息 around start 8小时 ===ss around end 方法的返回类型:null 方法的名称public abstract void cn.csdn.service.EmpService.work(java.lang.String)方法的参数:1目标对象:cn.csdn.service.EmpServiceImpl转载地址:http://xnlmi.baihongyu.com/