【济南校区】静态代理和动态代理的使用
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