Spring温故知新(八)静态切入点和CGLIB代理,更智能、更方便!
前面一章我们利用了Spring的AOP框架实现了WALL-E自动送礼物的功能,但是没有实现筛选,而且每次都还得先写一个ISpeaker接口。对于一些小程序而言其实每次都必须要先实现一个接口是比较啰嗦的步骤,那么首先我们来看看怎么样才能省略掉定义接口这个步骤。
Spring的代理机制有两种,第一种就是前一篇实现的基于接口的代理,叫做JAVA动态代理。就像之前介绍的那样,它的原理是利用了java JDK自带的代理接口。
而另外一种就是CBLIB代理,它使用的就是CGLIB的代理功能。
那么要使用CGLIB代理,首先要做的就是导入CBLIB的依赖包:
spring-framework-2.5.6\lib\cglib\cglib-nodep-2.1_3.jar
接着让我们重写一个新的Robot类,我们就叫它WallE类吧
package com.iteye.bolide74.action;public class WallE {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void say(String msg) {System.out.println("到达邻居家,对邻居说:" + msg + ",我是" + this.name);}public void clean() {System.out.println("开始进行垃圾回收程序");}}package com.iteye.bolide74.action;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class GetGift implements MethodBeforeAdvice {@Overridepublic void before(Method arg0, Object[] arg1, Object arg2)throws Throwable {System.out.println("通过MethodBeforeAdvice接口获取了一个礼物!");}}package com.iteye.bolide74.action;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class GiveGift implements AfterReturningAdvice {@Overridepublic void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable {System.out.println("通过AfterReturningAdvice接口赠予了一个礼物!");}}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><bean id="wallE" value="Wall-E" /></bean><bean id="getGift" /><bean id="giveGift" /><bean id="giftProxy" value="true" /><property name="target"><ref bean="wallE" /></property><property name="interceptorNames"><list><value>getGift</value><value>giveGift</value></list></property></bean></beans>
package com.iteye.bolide74.tester;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.iteye.bolide74.action.WallE;public class GiftBySpringTester {public static void main(String[] args) {ApplicationContext actx = new ClassPathXmlApplicationContext("config.xml");WallE wallE = (WallE) actx.getBean("giftProxy");wallE.say("你好,CGLIB代理向你问候");System.out.println();wallE.clean();}}