在coitheimjdk包下,创建代理类JdkProxy,该类需要实现InvocationHandler通达信交易编程接口,接口,并编写代理方法。在代理方法中,需要通过Proxy类实现动态代理,如所示。
在coitheimaspectxml包中,创建配置文件applicationContex.xml,并编写相关配置。
在该文件的代理方法中,首先创建了一个动态类对象Enhancer,它是CGLB的核心类;然后调用了Enhancer类的setSuperclass()方法来确定目标对象;接下来调用了setCallback()方法添加回调函数,其中的this代表的就是代理类CglibProxy本身;最后通过return语句将创建的代理类对象返回。Intercept()方法会在程序执行目标方法时被调用,方法运行时会将执行切面类中的方法增强。
执行程序后,控制台的输出结果如所示:
在coitheimjdk包中,创建测试类JdkTest。在该类中的main()方法中创建代理对象和目标对象,然后从代理对象中获得对目标对象userDao增强后的对象,最后调用该对象中的添加和删除方法,如所示。
需要注意的是,环绕通知必须接收一个类型为ProceedingJoinPoint的参数,返回值也必须是Object类型,且必须抛出异常。异常通知中可以传入Throwable类型的参数来输出异常信息。
这里为了演示效果,在目标方法前后分别执行了检查权限和记录日志的方法,这两个方法也就是增强的方法,也就是通知。
在该文件中,首先使用@Aspect注解定义了切面类,由于该类在Spring中是作为组件使用的,所以还需要添加@Component注解才能生效。然后使用了@Poincut注解来配置切入点表达式,并通过定义方法来表示切入点名称。接下来在每个通知相应的方法上添加了相应的注解,并将切入点名称“myPointCut”作为参数传递给需要执行增强的通知方法。如果需要其他参数(如异常通知的异常参数),可以根据代码提示传递相应的属性值。
执行程序后,控制台的输出结果如所示:
JDK动态代理
ASpectJ是个基于Java语言的AOP框架。它提供了强大的AOP功能。Spring0以后,SpringAOP引入了对AspectJ的支持,并允许直接使用ASpectJ进行编程,而Spring自身的AOPAPI也尽量与AspectJ保持一致。新版本的Spring框架,也建设使用AspectJ来开发AOP。使用AspectJ实现AOP有两种方式:一种是基于XML的声明式AspectJ,另一种是基于注解的AspectJ。
基于注解的声明式AspectJ
在coitheimjdk包中,创建UserDao通达信交易编程接口,接口的实现类UserDaolmpl,分别实现通达信交易编程接口,接口中的方法,并在每个方法中添加一条输出语句,如所示。
在coitheimcglib包中,创建测试类CglibTest。在该类的main()方法中首先创建代理对象和目标对象,然后从代理对象中获得增强后的目标对象,最后调用对象的添加和删除方法,如所示。
在该文件中,分别定义了5种不同类型的通知,在通知中使用了JoinPoint通达信交易编程接口,接口及其子通达信交易编程接口,接口ProceedingJoinPoint作为参数来获得目标对象的类名、目标方法名和目标方法参数等。
在目标类coitheimjdUserDaolmpl中,添加注解@Repository('userDao')。
基于XML的声明式AspectJ
在该文件中,首先在第8行代码中,分别引入了AOP的Schema约束,然后在配置文件中分别定义了目标类、切面和AOP的配置信息。
在该文件中,JdkProxy类实现了InvocationHandler通达信交易编程接口,接口,并实现了通达信交易编程接口,接口中的invoke方法,所有动态代理类所调用的方法都会交由该方法处理。在创建的代理方法createProxy()中,使用了newProxyInstance方法来创建代理对象。newProxyInstance
从中可以看出,目标类UserDao中的方法被成功调用并增强了。这种没有实现通达信交易编程接口,接口的代理方式,就是CGLIB代理。
在coitheimaspectannotation包下,创建配置文件applicationContext.xml,并对该文件进行编辑。
JDK动态代理的使用非常简单,但它还有一定的局限性一使用动态代理的对象必须实现一个或多个通达信交易编程接口,接口3如果要对没有实现通达信交易编程接口,接口的类进行代理那么可以使用CGLIB代理,CGLIB(CodeGenerationLibray)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成个子类,并对子类进行增强。在Spring的核心包中已经集成了CGLIB所需要的包,所以开发中不需要另外导入JAR包。
在coitheimaspectannotation包中,创建测试类TestAnnotation,如所示。
在coitheimcglib包中,创建代理类CglibProxy,该代理类需要实现MethodInterceptor通达信交易编程接口,接口并实现通达信交易编程接口,接口中的intercept()方法。
在coitheimfactorybean包中,创建配置文件applicationContext.xml,并指定代理对象。
在文件中,首先通过
从输出结果可以看出,UserDao实例中的添加用户和删除用户的方法已被成功调用,并且在调用前后分别增加了检查权限和记录日志的功能。这种实现了通达信交易编程接口,接口的代理方式,就是Spring中的JDK动态代理。
方法中包含3个参数,其中第1个参数是当前类的类加载器,第2个参数表示的是被代理对象实现的所有通达信交易编程接口,接口,第3个参数this代表的就是代理类JdKProxy本身。在invoke()方法中,目标类方法执行的前后,会分别执行切面类中的check_Permission()方法和log()方法。
基于代理类的AOP实现
在coitheimaaspectxml包下,创建测试类TestXmlAspectj,在类中为了更加清晰地演示几种通知的执行情况,这里只对addUser()方法进行增强测试示。
导入ASpectJ框架相关的JAR包。
在coitheimfactorybean包中,创建测试类ProxyFactoryBeanTest,在类中通过Spring容器获取代理对象的实例,并执行目标方法,如所示。
JDK动态代理是通过Javlanreflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance方法来创建代理对象。对于使用业务通达信交易编程接口,接口的类,Sping默认会使用JDK动态代理来实现AOP。
执行程序后,控制台的输出结果如所示:
执行程序后,控制台的输出结果如所示:
文章为作者独立观点,不代表股票交易接口观点