5.实现初始化JavaBean拦截器InitParamsInterceptor
该类继承AbstractInterceptor,只需覆盖before方法即可。其代码如下:
public class InitParamsInterceptor extends AbstractInterceptor {
public void before(InvokeJniInfo invInfo) {
if(invInfo.getArgs().length>0){
//初始化第一个参数
InitContainsObjectNullUtil.initContainsOutParameter(invInfo.getArgs()[0]);
}
}
}
6.实现动态代理处理器InterceptorHandler
该类实现了java.lang.reflect.InvocationHandler接口。
public class InterceptorHandler implements InvocationHandler {
private static Log log = LogFactory.getLog(InterceptorHandler.class);
//拦截器列表
private List interceptors = null;
//存放原始对象
private Object orginalObject;
//使用Proxy返回一个对象。注意这里传进去的对象的对象必须实现一个接口
public Object bind(Object obj) {
this.orginalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
Throwable ex = null;
InvokeJniInfo invInfo = new InvokeJniInfo(proxy,method,args,result,ex);
log.debug("Invoking Before Intercepors!");
//实现方法调用之前进行拦截的方法
invokeInterceptorBefor(invInfo);
try{
log.debug("Invoking Proxy Method!");
//调用方法
result = method.invoke(orginalObject,args);
invInfo.setResult(result);
log.debug("Invoking After method!");
//实现方法调用之后进行拦截的方法
invokeInterceptorAfter(invInfo);
}catch(Throwable tr){
invInfo.setException(tr);
log.error("Invoking exceptionThrow method!");
//实现出现异常进行拦截的方法
invokeInterceptorExceptionThrow(invInfo);
}
return result;
}
//获取拦截器列表
private synchronized List getIntercetors(){
if(null == interceptors){
interceptors = new ArrayList();
//添加日志记录拦截器
interceptors.add(new LogInterceptor());
//添加初始化JavaBean拦截器
interceptors.add(new InitParamsInterceptor());
//如果需要添加其他功能,可以很方便的添加其他的拦截器实现功能
}
return interceptors;
}
private void invokeInterceptorBefor(InvokeJniInfo invInfo){
List interceptors = getIntercetors();
int len = interceptors.size();
//遍历所有拦截器,并调用拦截器的before方法
for(int i = 0;i((Interceptor)interceptors.get(i)).before(invInfo);
}
}
private void invokeInterceptorAfter(InvokeJniInfo invInfo){
List interceptors = getIntercetors();
int len = interceptors.size();
//遍历所有拦截器,并调用拦截器的after方法
for(int i = len - 1;i >= 0;i--){
((Interceptor)interceptors.get(i)).after(invInfo);
}
}
private void invokeInterceptorExceptionThrow(InvokeJniInfo invInfo){
List interceptors = getIntercetors();
int len = interceptors.size();
//遍历所有拦截器,并调用拦截器的exceptionThrow方法
for(int i = len - 1;i >= 0;i--){
((Interceptor)interceptors.get(i)).exceptionThrow(invInfo);
}
}
}
7.获取动态代理对象工厂InterceptorFactory
public class InterceptorFactory {
private static Log log = LogFactory.getLog(InterceptorFactory.class);
public static Object getClassInstance(String clzName) {
Class cls;
Object obj = null;
try {
cls = Class.forName(clzName);
obj = (Object) cls.newInstance();
} catch (Exception e) {
log.error(e.getStackTrace());
}
return obj;
}
public static Object getInterceptorProxyedObject(String clzName) {
InterceptorHandler aopHandler = new InterceptorHandler();
Object obj = getClassInstance(clzName);
return aopHandler.bind(obj);
}
}
8.修改以前的代码,使用动态代理实现
public class SOAP{
private JniInterface jni = null;
private Log log = 。。。;
public SOAP(){
jni=(JniInterface)InterceptorFactory.getInterceptorProxyedObject("JniClass");
}
/**方法A**/
public JavaBeanA aMethod(JavaBeanA javaBeanA){
return jni.aMethod(javaBeanA);
}
……………………………………
……………………………………
等等,很多这样的方法
……………………………………
……………………………………
}
从红色代码对比可以看出,省了很多代码。
三、总结
1.必须彻底贯彻针对接口编成这一编程思想。
2.明白了这个,是不是也明白了Spring的AOP的实现了?以及为什么要使用Spring的AOP的时候必须使用他的BeanFactory呢?