原文地址

http://michael-softtech.iteye.com/blog/650779

(1)使用ProxyFactoryBean的代理

Java代码

  1. package chapter4;

  2. public interface Performable {

  3. public void perform() throws Exception;

  4. }

  5. package chapter4;

  6. import java.util.Random;

  7. public class Artist implements Performable {

  8. public void perform() throws Exception {

  9. int num = new Random().nextInt(100);

  10. if(num >= 50) {

  11. throw new Exception(String.valueOf(num));

  12. } else {

  13. System.out.println(num);

  14. }

  15. }

  16. }

  17. package chapter4;

  18. public class Audience {

  19. public Audience() {

  20. }

  21. public void takeSeats() {

  22. System.out.println("The audience is taking their seats.");

  23. }

  24. public void turnOffCellPhones() {

  25. System.out.println("The audience is turning off " + "their cellphones");

  26. }

  27. public void applaud() {

  28. System.out.println("CLAP CLAP CLAP CLAP CLAP");

  29. }

  30. public void demandRefund() {

  31. System.out.println("Boo! We want our money back!");

  32. }

  33. }

  34. package chapter4;

  35. import java.lang.reflect.Method;

  36. import org.springframework.aop.AfterReturningAdvice;

  37. import org.springframework.aop.MethodBeforeAdvice;

  38. import org.springframework.aop.ThrowsAdvice;

  39. public class AudienceAdvice

  40. implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {

  41. private Audience audience;

  42. public void setAudience(Audience audience) {

  43. this.audience = audience;

  44. }

  45. public void before(Method method, Object[] args, Object target)

  46. throws Throwable {

  47. audience.takeSeats();

  48. audience.turnOffCellPhones();

  49. }

  50. public void afterReturning(Object returnValue, Method method, Object[] args,

  51. Object target) throws Throwable {

  52. audience.applaud();

  53. }

  54. public void afterThrowing(Exception ex) {

  55. audience.demandRefund();

  56. }

  57. }

Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:aop="http://www.springframework.org/schema/aop"

  5. xmlns:tx="http://www.springframework.org/schema/tx"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  7. <bean id="audience" class="chapter4.Audience" />

  8. <bean id="audienceAdvice" class="chapter4.AudienceAdvice" >

  9. <property name="audience" ref="audience" />

  10. </bean>

  11. <bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcu

    tAdvisor">

  12. <property name="advice" ref="audienceAdvice" />

  13. <property name="expression" value="execution(* *.perform(..))" />

  14. </bean>

  15. <bean id="artistTarget" class="chapter4.Artist" />

  16. <bean id="artist" class="org.springframework.aop.framework.ProxyFactoryBean" >

  17. <property name="target" ref="artistTarget" />

  18. <property name="interceptorNames" value="audienceAdvisor" />

  19. <property name="proxyInterfaces" value="chapter4.Performable" />

  20. </bean>

  21. </beans>

(2)隐式使用ProxyFactoryBean的aop代理

DefaultAdvisorAutoProxyCreator实现了BeanPostProcessor,它将自动检查advisor的pointcut是否匹配bean的方法,如果匹配会替换bean为一个proxy,并且应用其advice。

Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:aop="http://www.springframework.org/schema/aop"

  5. xmlns:tx="http://www.springframework.org/schema/tx"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  7. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyC

    reator" />

  8. <bean id="audience" class="chapter4.Audience" />

  9. <bean id="audienceAdvice" class="chapter4.AudienceAdvice" >

  10. <property name="audience" ref="audience" />

  11. </bean>

  12. <bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcu

    tAdvisor">

  13. <property name="advice" ref="audienceAdvice" />

  14. <property name="expression" value="execution(* *.perform(..))" />

  15. </bean>

  16. <bean id="artist" class="chapter4.Artist" />

  17. </beans>

(3)使用注解的aop代理

xml中增加了一个<aop:aspectj-autoproxy />,它创建了AnnotationAwareAspectJAutoProxyCreator在spring中,这个类将自动代理匹配的类的放方法。和上个例子中DefaultAdvisorAutoProxyCreator做同样的工作。

Java代码

  1. package chapter4;

  2. import org.aspectj.lang.annotation.AfterReturning;

  3. import org.aspectj.lang.annotation.AfterThrowing;

  4. import org.aspectj.lang.annotation.Aspect;

  5. import org.aspectj.lang.annotation.Before;

  6. import org.aspectj.lang.annotation.Pointcut;

  7. @Aspect

  8. public class Audience {

  9. public Audience() {

  10. }

  11. @Pointcut("execution(* *.perform(..))")

  12. public void pointcut(){}

  13. @Before("pointcut()")

  14. public void takeSeats() {

  15. System.out.println("The audience is taking their seats.");

  16. }

  17. @Before("pointcut()")

  18. public void turnOffCellPhones() {

  19. System.out.println("The audience is turning off " + "their cellphones");

  20. }

  21. @AfterReturning("pointcut()")

  22. public void applaud() {

  23. System.out.println("CLAP CLAP CLAP CLAP CLAP");

  24. }

  25. @AfterThrowing("pointcut()")

  26. public void demandRefund() {

  27. System.out.println("Boo! We want our money back!");

  28. }

  29. }

Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:aop="http://www.springframework.org/schema/aop"

  5. xmlns:tx="http://www.springframework.org/schema/tx"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  7. <aop:aspectj-autoproxy />

  8. <bean id="audience" class="chapter4.Audience" />

  9. <bean id="artist" class="chapter4.Artist" />

  10. </beans>

(4)使用aop配置文件的自动代理

采用这种方法,不用加<aop:aspectj-autoproxy />

Java代码

  1. package chapter4;

  2. import org.aspectj.lang.annotation.Aspect;

  3. @Aspect

  4. public class Audience {

  5. public Audience() {

  6. }

  7. public void pointcut() {

  8. }

  9. public void takeSeats() {

  10. System.out.println("The audience is taking their seats.");

  11. }

  12. public void turnOffCellPhones() {

  13. System.out.println("The audience is turning off " + "their cellphones");

  14. }

  15. public void applaud() {

  16. System.out.println("CLAP CLAP CLAP CLAP CLAP");

  17. }

  18. public void demandRefund() {

  19. System.out.println("Boo! We want our money back!");

  20. }

  21. }

Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:aop="http://www.springframework.org/schema/aop"

  5. xmlns:tx="http://www.springframework.org/schema/tx"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  7. <bean id="audience" class="chapter4.Audience" />

  8. <aop:config>

  9. <aop:aspect ref="audience">

  10. <aop:before method="takeSeats" pointcut="execution(* *.perform(..))" />

  11. <aop:before method="turnOffCellPhones" pointcut="execution(* *.perform(..))" />

  12. <aop:after-returning method="applaud" pointcut="execution(* *.perform(..))" />

  13. <aop:after-throwing method="demandRefund" pointcut="execution(* *.perform(..))" />

  14. </aop:aspect>

  15. </aop:config>

  16. <bean id="artist" class="chapter4.Artist" />

  17. </beans>

AOP实现方法的更多相关文章

  1. JS实现AOP拦截方法调用

    //JS实现AOP拦截方法调用function jsAOP(obj,handlers) {    if(typeof obj == 'function'){        obj = obj.prot ...

  2. AOP记录方法的执行时间

    作用AOP监控方法的运行时间如下: @Component @Aspect public class LogAop { private Logger log = LoggerFactory.getLog ...

  3. 动态代理AOP实现方法过滤

    上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例 ...

  4. AOP获取方法注解实现动态切换数据源

    AOP获取方法注解实现动态切换数据源(以下方式尚未经过测试,仅提供思路) ------ 自定义一个用于切换数据源的注解: package com.xxx.annotation; import org. ...

  5. 使用Spring Aop验证方法参数是否合法

    先定义两个注解类ValidateGroup 和 ValidateFiled ValidateGroup .java package com.zf.ann; import java.lang.annot ...

  6. 使用AOP实现方法执行时间和自定义注解

    环境:IDEA2018+JDK1.8+SpringBoot 第一步:在pom文件中引入依赖(度娘有很多(*^▽^*)): <!--引入AOP的依赖--><dependency> ...

  7. (一)七种AOP实现方法

    在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...

  8. JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)

    AOP用CGLib更简便.更可控. 动态代理的实现非常优雅. 实体类: public class SampleClass { public String MyFunction1(String inpu ...

  9. AOP 增强方法

    Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知).After Returning Advice(后置通知).Interception Around A ...

随机推荐

  1. android 17 activity生命周期

    手机指南针传感器处于手机头部. Activity生命周期: 启动. onCreat()方法:初始化布局对象,设置监听器. onstart()方法:注册监听器. onResume():activity已 ...

  2. optimizer hints

    In version MySQL 5.7.7 Oracle presented a new promising feature: optimizer hints. However it did not ...

  3. [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中

    近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...

  4. IIS7.5 asp+access数据库连接失败处理 64位系统

    IIS7.5 asp+access数据库连接失败处理(SRV 2008R2 x64/win7 x64) IIS7.5不支持oledb4.0驱动?把IIS运行模式设置成32位就可以了,微软没有支持出64 ...

  5. sql 作业+游标 自动备份数据库

    前言 昨天有个同事在客户的服务器上面弄数据库,不小心执行了一条 sql 语句 TRUNCATE TABLE xxx 碉堡了吧,数据全没了  - - ,然后就是在网上拼命的搜索关于数据恢复的软件,搞了一 ...

  6. 利用ASP.NET AJAX的Timer讓GridView每隔一段時間做到自動換頁的功能

    最近在討論區看到這個問題,小弟利用asp.net ajax的timer來實作這個功能 利用timer每隔一段時間,讓gridview自動跳頁並且更新gridview的內容 asp.net(c#) Gr ...

  7. OpenWrt的主Makefile工作过程

    OpenWrt是一个典型的嵌入式Linux工程,了解OpenWrt的Makefile的工作过程对提高嵌入式Linux工程的开发能力有极其重要意义. OpenWrt的主Makefile文件只有100行, ...

  8. CentOS 7设置iptables防火墙开放proftpd端口

    由于ftp的被动模式是这样的,客户端跟服务器端的21号端口交互信令,服务器端开启21号端口能够使客户端登录以及查看目录.但是ftp被动模式用于传输数据的端口却不是21,而是大于1024的随机或配置文件 ...

  9. SQL SERVER 中PatIndex的用法个人理解

    一般用法:PatIndex('%AAA%',‘BBBBBBBB’) 上句的意思是查找AAA在BBBBBBBB中的位置,从1开始计算,如果没有的话则返回0 其中%AAA%的用法和 SQL语句中like的 ...

  10. js判断是否在iframe中

    1.方式一 if (self.frameElement && self.frameElement.tagName == "IFRAME") { alert('在if ...