轻松掌握Java代理模式
和大家一起聊一聊java代理模式
1、静态代理
1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。
publicinterfaceIUserDao{
voidsave();
}
1.2被代理的类,目标对象
publicclassUserDaoimplementsIUserDao{
@Override
publicvoidsave(){
System.out.println("-----已经保存数据!!!------");
}
}
1.3代理对象
publicclassUserDaoProxyimplementsIUserDao{
//接收保存目标对象
privateIUserDaotarget;
publicUserDaoProxy(IUserDaotarget){
this.target=target;
}
@Override
publicvoidsave(){
System.out.println("开始事务...");
target.save();//执行目标对象的方法
System.out.println("提交事务...");
}
}
1.4测试类
publicclassApp{
publicstaticvoidmain(String[]args){
//目标对象
IUserDaotarget=newUserDao();
//代理
IUserDaoproxy=newUserDaoProxy(target);
proxy.save();//执行的是,代理的方法
}
}
2、动态代理
2.1同样的,动态代理也需要完成一个接口。(同上)
2.2目标对象也是相同的。
2.3只是在代理对象上有所不同
publicclassProxyFactory{
//维护一个目标对象
privateObjecttarget;
publicProxyFactory(Objecttarget){
this.target=target;
}
//给目标对象,生成代理对象
publicObjectgetProxyInstance(){
returnProxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
newInvocationHandler(){
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
System.out.println("开启事务");
//执行目标对象方法
ObjectreturnValue=method.invoke(target,args);
System.out.println("提交事务");
returnreturnValue;
}
});
}
}
2.4测试类
publicclassApp{
publicstaticvoidmain(String[]args){
//目标对象
IUserDaotarget=newUserDao();
System.out.println(target.getClass());
//给目标对象,创建代理对象
IUserDaoproxy=(IUserDao)newProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
//执行方法【代理对象】
proxy.save();
}
}
3、cglib代理
3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。
3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。
publicclassProxyFactoryimplementsMethodInterceptor{
//维护目标对象
privateObjecttarget;
publicProxyFactory(Objecttarget){
this.target=target;
}
//给目标对象创建代理对象
publicObjectgetProxyInstance(){
//1.工具类
Enhanceren=newEnhancer();
//2.设置父类
en.setSuperclass(target.getClass());
//3.设置回调函数
en.setCallback(this);
//4.创建子类(代理对象)
returnen.create();
}
@Override
publicObjectintercept(Objectobj,Methodmethod,Object[]args,
MethodProxyproxy)throwsThrowable{
System.out.println("开始事务.....");
//执行目标对象的方法
ObjectreturnValue=method.invoke(target,args);
System.out.println("提交事务.....");
returnreturnValue;
}
}
3.3测试类
publicclassApp{
publicstaticvoidmain(String[]args){
//目标对象
UserDaotarget=newUserDao();
System.out.println(target.getClass());
//代理对象
UserDaoproxy=(UserDao)newProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());
//执行代理对象的方法
proxy.save();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。