异常通知: public class BookExceptionAdvice implements ThrowsAdvice { public void afterThrowing(Method method, Object[] args, Object target, Exception ex) { String message = method.getName() + "方法,出现了异常,异常的信息是:" + ex.getMessage(); System.out.println(message); } } 前置通知: import org.springframework.aop.MethodBeforeAdvice; //一定要加载AOP的库才可以使用 MethodBeforeAdvice --> Advice(org.aopalliance不在spring包中) --> Interceptor public class LogAdvice implements MethodBeforeAdvice { private static DateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒"); // Object target: target of the method invocation. May be null. public void before(Method m, Object[] args, Object target) throws Throwable { System.out.println("/n[系统日志][" + sdf.format(new Date()) + "] 调用方法:" + m.getName() + "(参数是: " + Arrays.toString(args) + ")"); } } 后置通知: public class RakeOffAdvice implements AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { //只有bug方法才返利 if (method.getName().equals("buy")) { System.out.println("[销售返利][" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "] " + args[0] + ": 返利3元"); } } } 环绕通知: package bookstore.log; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /* * 环绕增强 */ public class GreetingInterceptor implements MethodInterceptor { /* * MethodInvocation不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象 * 通过getArguments()可以获取目标方法的入参数组,通过proceed()反射调用目标实例相应的方法 */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { Object[] args = invocation.getArguments(); //目标方法入参 String user = (String) args[0]; System.out.println("你好!" + user); //运行方法前调用 Object obj = invocation.proceed(); //调用方法 System.out.println("欢迎你的光临!"); //目标方法之后运行 return obj; } } Spring的配置文件: <?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="bookBizTarget" class="bookstore.biz.BookBizImpl" /> <!-- 日志记录类(前置) --> <bean id="logAdvice" class="bookstore.log.LogAdvice" /> <!-- 日志记录类(后置) --> <bean id="rakeOffAdvice" class="bookstore.log.RakeOffAdvice" /> <!-- 环绕通知 --> <bean id="greetingAround" class="bookstore.log.GreetingInterceptor"/> <!-- 代理工厂类进行织入 --> <bean id="bookBiz" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 相应的业务接口 --> <property name="proxyInterfaces"> <value>bookstore.biz.BookBiz</value> </property> <!-- 设置要织入的类名,参数是一个字符串的数组 --> <property name="interceptorNames"> <list> <value>greetingAround</value> </list> </property> <!-- 代理实现的类 --> <property name="target" ref="bookBizTarget" /> </bean> </beans> 测试代码: public class AOPTest { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml"); // 将代理工厂做为业务接口的子对象 BookBiz bookBiz = (BookBiz) context.getBean("bookBiz"); // 直接调用接口方法 // bookBiz.buy("高志水", "CMMi实务手册", 50); bookBiz.comment("王筝", "《盗墓笔记》一点都不恐怖,很好看!"); } }