【济南校区】静态代理和动态代理的使用

2018-05-13  本文已影响0人  keaiai

 【济南校区】静态代理和动态代理的使用

 1.静态代理类是由程序员创建或者特定工具自动生成的代码,然后再进行编译的.在程序运行前代理类的.class文件已经存在了.

2.

动态代理类是在程序运行时,通过反射机制动态创建的.

静态代理的实现

          01.

用户管理类

public classUserServiceImp implements UserService {

public void addUser(String username, String passsword) {

// TODO Auto-generated method stub

System.out.println("UserServiceImp.addUser");

}

public void deleUser(String userId) {

// TODO Auto-generated method stub

System.out.println("UserServiceImp.deleUser");

}

}

           02.代理类--代理用户管理实现类

public classUserServiceImplProxy implements UserService {

private UserService userService;

public UserServiceImplProxy(UserService userSservice){

this.userService = userSservice;

}

public void addUser(String username, String passsword) {

try {

//

添加打印功能

System.out.println("start-addUser");

userService.addUser(username, passsword);

} catch (Exception e) {

//

添加用户失败

System.out.println("error--addUser");

}

}

public void deleUser(String userId) {

System.out.println("UserServiceImp.deleUser");

}

}

   03.客户端的实现

public void Test1(){

UserService userService = newUserServiceImplProxy(new UserServiceImp());

userService.addUser("zhangsan","123456");

}

静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类

所以还是用动态代理比较方便

01.动态代理的具体实现类

public class UserServiceImp implements UserService {

public void addUser(String username, String passsword) {

// TODO Auto-generated method stub

System.out.println("UserServiceImp.addUser");

}

public void deleUser(String userId) {

// TODO Auto-generated method stub

System.out.println("UserServiceImp.deleUser");

}

}

02.动态创建代理对象的类

public class UserServiceHandleProxy implements InvocationHandler {

//

创建目标对象

private Object targetPbject;

//

绑定关系

public Object newProxyInstance(Object targetPbject){

this.targetPbject = targetPbject;

returnProxy.newProxyInstance(targetPbject.getClass().getClassLoader(),

targetPbject.getClass().getInterfaces(), this);

}

@Override

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

System.out.println("start-->>");

for(inti=0;i

System.out.println(args);

}

Objectret=null;

try{

/*

原对象方法调用前处理日志信息*/

System.out.println("satrt-->>");

//

调用目标方法

ret=method.invoke(targetPbject, args);

/*

原对象方法调用后处理日志信息*/

System.out.println("success-->>");

}catch(Exceptione){

e.printStackTrace();

System.out.println("error-->>");

throwe;

}

returnret;

}

}

03.客户端的具体实现

public void Test2(){

UserServiceHandleProxy handlerProxy = newUserServiceHandleProxy();

UserService userService =(UserService)handlerProxy.newProxyInstance(new UserServiceImp());

userService.addUser("zhangsan","123456");

}

}

通过动态代理我们可以做很多操作,如进行日志处理、事物管理、权限控制等事情。

[if !supportLineBreakNewLine]

[endif]

如果你想了解更多黑马课程请点击这里,如果你想加入黑马这个大家庭学习先进技术,广交天下好友!黑马程序员济南中心联系电话:0531-55696830

上一篇下一篇

猜你喜欢

热点阅读