如果项目不能使用JDK1.5以上,无法使用@AspectJ进行注解,Spring提供了基于Schema配置的方法,代替基于@AspectJ注解要面的方式。
1.XML配置
使用<aop:advisor>或<aop:aspect>进行配置
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <aop:config proxy-target-class="true"> <!-- <aop:advisor advice-ref="testAdvice" pointcut="execution(* com..*.Waiter.greetTo(..))"/> --> <aop:aspect ref="adviceMethods"> <aop:before method="preGreeting" pointcut="target(com.baobaotao.NaiveWaiter) and args(name)" arg-names="name" /> <aop:after-returning method="afterReturning" pointcut="target(com.baobaotao.SmartSeller)" returning="retVal" /> <aop:around method="aroundMethod" pointcut="execution(* serveTo(..)) and within(com.baobaotao.Waiter)" /> <aop:after-throwing method="afterThrowingMethod" pointcut="target(com.baobaotao.SmartSeller) and execution(* checkBill(..))" throwing="iae" /> <!-- <aop:after method="afterMethod" pointcut="execution(* com..*.Waiter.greetTo(..))" /> <aop:declare-parents implement-interface="com.baobaotao.Seller" default-impl="com.baobaotao.SmartSeller" types-matching="com.baobaotao.Waiter+" /> --> <aop:before method="bindParams" pointcut="target(com.baobaotao.NaiveWaiter) and args(name,num,..)"/> </aop:aspect> </aop:config> <bean id="testAdvice" class="com.baobaotao.schema.TestBeforeAdvice"/> <bean id="adviceMethods" class="com.baobaotao.schema.AdviceMethods" /> <bean id="naiveWaiter" class="com.baobaotao.NaiveWaiter" /> <bean id="naughtyWaiter" class="com.baobaotao.NaughtyWaiter" /> <bean id="seller" class="com.baobaotao.SmartSeller" /> </beans>
2.相关的类和接口
package com.baobaotao.schema; import org.aspectj.lang.ProceedingJoinPoint; public class AdviceMethods { public void preGreeting(String name) { System.out.println("--how are you!--"); System.out.println(name); } //后置增强对应方法 public void afterReturning(int retVal){ System.out.println("----afterReturning()----"); System.out.println("returnValue:"+retVal); System.out.println("----afterReturning()----"); } //环绕增强对应方法 public void aroundMethod(ProceedingJoinPoint pjp){ System.out.println("----aroundMethod()----"); System.out.println("args[0]:"+pjp.getArgs()[0]); System.out.println("----aroundMethod()----"); } //抛出异常增强 public void afterThrowingMethod(IllegalArgumentException iae){ System.out.println("----afterThrowingMethod()----"); System.out.println("exception msg:"+iae.getMessage()); System.out.println("----afterThrowingMethod()----"); } //final增强 public void afterMethod(){ System.out.println("----afterMethod()----"); } //------------绑定连接点参数----------// public void bindParams(int num,String name){ System.out.println("----bindParams()----"); System.out.println("name:"+name); System.out.println("num:"+num); System.out.println("----bindParams()----"); } } public class TestBeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("------TestBeforeAdvice------"); System.out.println("clientName:"+args[0]); System.out.println("------TestBeforeAdvice------"); } } public interface Waiter { @NeedTest public void greetTo(String clientName); public void serveTo(String clientName); } @Monitorable public class NaiveWaiter implements Waiter { @NeedTest public void greetTo(String clientName) { System.out.println("NaiveWaiter:greet to "+clientName+"..."); } @NeedTest public void serveTo(String clientName){ System.out.println("NaiveWaiter:serving "+clientName+"..."); } public void smile(String clientName,int times){ System.out.println("NaiveWaiter:smile to "+clientName+ times+"times..."); } } public class NaughtyWaiter implements Waiter { public void greetTo(String clientName) { System.out.println("NaughtyWaiter:greet to "+clientName+"..."); } public void serveTo(String clientName){ System.out.println("NaughtyWaiter:serving "+clientName+"..."); } public void joke(String clientName,int times){ System.out.println("NaughtyWaiter:play "+times+" jokes to "+clientName+"..."); } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Monitorable { }
3.测试
package com.baobaotao.schema; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.baobaotao.NaiveWaiter; import com.baobaotao.Seller; import com.baobaotao.SmartSeller; import com.baobaotao.Waiter; public class SchemaAspectTest { public static void main(String[] args) { String configPath = "com/baobaotao/schema/beans.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath); Waiter naiveWaiter = (Waiter) ctx.getBean("naiveWaiter"); Waiter naughtyWaiter = (Waiter) ctx.getBean("naughtyWaiter"); Seller seller = (Seller) ctx.getBean("seller"); naiveWaiter.greetTo("John"); naughtyWaiter.greetTo("Tom"); //后置增强 ((SmartSeller)seller).sell("Beer","John"); //环境增强 // naiveWaiter.serveTo("John"); //抛出异常增强 // ((SmartSeller)seller).checkBill(1); //final增强 // naiveWaiter.greetTo("John"); //引入增强 // ((Seller)naiveWaiter).sell("Beer","John"); // ((NaiveWaiter)naiveWaiter).smile("John", 2); //advisor //naiveWaiter.greetTo("John"); } }
相关推荐
62. 解释基于 XML Schema 方式的切面实现 63. 解释基于注解的切面实现 64. 什么是 Spring 的 MVC 框架? 65. DispatcherServlet 66. WebApplicationContext 67. 什么是 Spring MVC 框架的控制器? 68. @Controller ...
7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 ...
6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 ...
6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点...
7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 ...
6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...
6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...
6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点...
目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 ...AOP面向切面编程 715 AOP的专业术语 715 Spring事务管理 718 Spring与Struts整合 719 Spring与Hibernate整合 721 独立实践 724