静态代理模式
概念:
- 静态代理:代理类由程序员自己编写(代理类会对目标对象的特定方法进行增强)
思路:
- 1):设计接口:原因:代理对象和目标对象都会实现同一个功能。
- 2):编写目标对象(类):实现接口。
- 3):编写代理对象(类):注入目标对象,调用其方法,最后增强方法。
详细代码:
//设计一个接口
public interface UserService {
void insert();
}
/**
* 目标对象
* 此处可以编写一些sql语句
* 调用dao传入参数
*/
public class UserServiceImpl implements UserService {
@Override
public void insert() {
System.out.println("目标对象的调用");
}
}
//切面类相当于一个事务的工具类
public class TranAop {
public void before(){System.out.println("开启事务===>start transaction/begin");}
public void after(){System.out.println("正常执行事务");}
public void exception(){System.out.println("失败回滚事务===>roll back");}
public void myFinally(){System.out.println("最终操作例如关闭数据库等等");}
}
//代理类
public class UserServiceProxyAopImpl implements UserService {
//运用注入
private UserService userService;
private TranAop tranAop;
//构造方法
public UserServiceProxyAopImpl(UserService userService, TranAop tranAop) {
this.userService = userService;
this.tranAop = tranAop;
}
@Override
public void insert() {
try{
tranAop.before();
userService.insert();//目标对象调用
tranAop.after();
}catch(Exception e){
tranAop.exception();
}finally{
tranAop.myFinally();
}
}
}
//测试类
public void test2(){
TranAop tranAop = new TranAop();
UserServiceImpl userService = new UserServiceImpl();
UserServiceProxyAopImpl userServiceProxyAop = new UserServiceProxyAopImpl(userService,tranAop);
userServiceProxyAop.insert();
}
静态代理模式的缺点
每次编写一个目标类的时候,都需要重新编写多个代理类,很麻烦,有可能会出现错误。