黑马程序员技术交流社区
标题: 【济南校区】静态代理和动态代理的使用 [打印本页]
作者: 小鲁哥哥 时间: 2018-3-16 13:53
标题: 【济南校区】静态代理和动态代理的使用
本帖最后由 小鲁哥哥 于 2018-3-16 14:39 编辑
【济南校区】静态代理和动态代理的使用
1.静态代理类是由程序员创建或者特定工具自动生成的代码,然后再进行编译的.在程序运行前代理类的.class文件已经存在了.
2.动态代理类是在程序运行时,通过反射机制动态创建的.
静态代理的实现
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 UserServiceImplProxy 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 = new UserServiceImplProxy(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;
return Proxy.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(int i=0;i<args.length;i++){
System.out.println(args);
}
Object ret=null;
try{
/*原对象方法调用前处理日志信息*/
System.out.println("satrt-->>");
//调用目标方法
ret=method.invoke(targetPbject, args);
/*原对象方法调用后处理日志信息*/
System.out.println("success-->>");
}catch(Exception e){
e.printStackTrace();
System.out.println("error-->>");
throw e;
}
return ret;
}
}
03.客户端的具体实现
public void Test2(){
UserServiceHandleProxy handlerProxy = new UserServiceHandleProxy();
UserService userService =(UserService) handlerProxy.newProxyInstance(new UserServiceImp());
userService.addUser("zhangsan", "123456");
}
}
通过动态代理我们可以做很多操作,如进行日志处理、事物管理、权限控制等事情。
如果你想了解更多黑马课程请点击这里,如果你想加入黑马这个大家庭学习先进技术,广交天下好友! 黑马程序员济南中心联系电话:0531-55696830
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |