使用Proxy和InvocationHandler实现代理器模式 实现spring aop
来源:互联网 发布:公司网络一会断一会好 编辑:程序博客网 时间:2024/06/05 17:48
[转自: http://publishblog.blogdriver.com/blog/tb.b?diaryID=842351 ]
[Java]使用Proxy和InvocationHandler实现代理器模式
- 元对象(被代理对象):
package com.zj.gof.proxy;
public interface StudentInfoService {
void findInfo(String studentName);
}
package com.zj.gof.proxy;
public class StudentInfoServiceImpl implements StudentInfoService {
public void findInfo(String name) {
System.out.println("你目前输入的名字是:" + name);
}
}
- 代理对象:
package com.zj.gof.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.log4j.Logger;
public class LogHandler implements InvocationHandler {
private Object proxyObj;
private static Logger log=Logger.getLogger(LogHandler.class);
public Object bind(Object obj){
this.proxyObj=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;
try{
//请在这里插入代码,在方法前调用
log.info("调用log日志方法"+method.getName());
result=method.invoke(proxyObj,args); //原方法
//请在这里插入代码,方法后调用
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}
注意:通过InvocationHandler接口实现的代理器只能代理接口方法. (这点在InvocationHandler的注解中有说明)
- 代理工厂:
package com.zj.gof.proxy;
public class LogFactory {
private static Object getClassInstance(String clzName) {
Object obj = null;
try {
Class cls = Class.forName(clzName);
obj = (Object) cls.newInstance();
} catch (ClassNotFoundException cnfe) {
System.out.println("ClassNotFoundException:" + cnfe.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
public static Object getAOPProxyedObject(String clzName) {
Object proxy = null;
LogHandler handler = new LogHandler();
Object obj = getClassInstance(clzName);
if (obj != null) {
proxy = handler.bind(obj);
} else {
System.out.println("Can't get the proxyobj");
//throw
}
return proxy;
}
}
- 客户端调用:
package com.zj.gof.proxy;
public class MainTest {
public static void main(String[] args) {
// PropertyConfigurator.configure("d:/log4j.properties");
BasicConfigurator.configure();
StudentInfoService studentInfo = (StudentInfoService) LogFactory
.getAOPProxyedObject("com.zj.gof.proxy.StudentInfoServiceImpl");
studentInfo.findInfo("阿飞");
}
}
- 运行结果:
0 [main] INFO root - 调用log日志方法findInfo
你目前输入的名字是:阿飞
- 使用Proxy和InvocationHandler实现代理器模式 实现spring aop
- Proxy和InvocationHandler模拟Aop底层实现
- Proxy和InvocationHandler实现自己的AOP
- JDK使用InvocationHandler和Proxy实现动态代理
- Spring AOP的底层实现技术 Proxy InvocationHandler
- Spring AOP的底层实现技术 Proxy InvocationHandler
- Spring AOP的底层实现技术 Proxy InvocationHandler
- 使用JDK中的InvocationHandler、Proxy实现动态代理
- 动态代理两个类Proxy和InvocationHandler的模拟实现
- java动态代理实现Proxy和InvocationHandler cglib
- 代理模式(proxy)和spring AOP
- JAVA动态代理实现 Proxy InvocationHandler
- 使用Proxy和InvocationHandler创建动态代理
- InvocationHandler+工厂设计模式 实现动态代理
- Spring AOP实现基础动态代理(Proxy)
- 【引用】模拟JDK实现动态代理(自写Proxy类和InvocationHandler接口)
- Java动态代理借助Proxy与InvocationHandler实现
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- CGI和FastCGI的区别
- Android:最火的快速开发框架XUtils
- 被覆写的方法不能为private
- 关于pdf文件如何合并的方法
- 将定制的java包引入到android系统中
- 使用Proxy和InvocationHandler实现代理器模式 实现spring aop
- C++与Flex之间socket通信policy-file-request解决方案
- 最大子列和问题(20)
- C++实现单例的例子(备忘录)
- iOS 7.0之后的UILabel左上,右下显示
- Mysql Left Join Where On
- iOS8 launch image的设置方法
- 寒假项目1-动态链表体验(改造)(3)
- storage size of 'a' isn't known