昆明java培训
达内昆明广州春城路

18487146383

热门课程

java程序员:代理模式

  • 时间:2016-09-28
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训机构的老师今天给大家讲java的代理模式

1、静态代理

1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。

public interface IUserDao {

void save();

}

1.2被代理的类,目标对象

public class UserDao implements IUserDao{

@Override

public void save() {

System.out.println("-----已经保存数据!!!------");

}

}

1.3代理对象

public class UserDaoProxy implements IUserDao{

//接收保存目标对象

private IUserDao target;

public UserDaoProxy(IUserDao target) {

this.target = target;

}

@Override

public void save() {

System.out.println("开始事务...");

target.save();            //执行目标对象的方法

System.out.println("提交事务...");

}

}

1.4测试类

public class App {

public static void main(String[] args) {

//目标对象

IUserDao target = new UserDao();

//代理

IUserDao proxy = new UserDaoProxy(target);

proxy.save(); //执行的是,代理的方法

}

}

2、动态代理

2.1同样的,动态代理也需要完成一个接口。(同上)

2.2目标对象也是相同的。

2.3只是在代理对象上有所不同

public class ProxyFactory {

//维护一个目标对象

private Object target;

public ProxyFactory(Object target){

this.target = target;

}

//给目标对象,生成代理对象 

public Object getProxyInstance() {

return Proxy.newProxyInstance(

target.getClass().getClassLoader(),

target.getClass().getInterfaces(),

new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("开启事务");

//执行目标对象方法

Object returnValue = method.invoke(target, args);   

System.out.println("提交事务");

return returnValue;

}

});

}

}

2.4测试类

public class App {

public static void main(String[] args) {

//目标对象

IUserDao target = new UserDao();

System.out.println(target.getClass());

//给目标对象,创建代理对象

IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();

System.out.println(proxy.getClass());

//执行方法  【代理对象】

proxy.save();

}

}

3、cglib代理

3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。

public class ProxyFactory implements MethodInterceptor{

//维护目标对象

private Object target;

public ProxyFactory(Object target){

this.target = target;

}

//给目标对象创建代理对象

public Object getProxyInstance(){

//1.工具类

Enhancer en = new Enhancer();

//2.设置父类

en.setSuperclass(target.getClass());

//3.设置回调函数

en.setCallback(this);

//4.创建子类(代理对象)

return en.create();

}

@Override

public Object intercept(Object obj, Method method, Object[] args,

MethodProxy proxy) throws Throwable {

System.out.println("开始事务.....");

//执行目标对象的方法

Object returnValue = method.invoke(target, args);

System.out.println("提交事务.....");

return returnValue;

}

}

3.3测试类

public class App {

public static void main(String[] args) {

//目标对象

UserDao target = new UserDao();

System.out.println(target.getClass());

//代理对象

UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();

System.out.println(proxy.getClass());

//执行代理对象的方法

proxy.save();

}

}

学Java开发就到昆明达内Java培训班!了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!         

上一篇:使用泛型对java数组扩容
下一篇:你是哪种类型的程序员

昆明java培训机构:java未来的发展走向

昆明java培训机构:java学完可以干什么!

昆明java培训机构:如何搞定BAT和华为offer?有这份攻略就够了!

昆明java培训机构:学Java别担心枯燥和无聊

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货