代理模式
一:静态代理
要求代理的类
public interface UserService {
void save();
}
public class UserServiceImpl implements UserService{
@Override
public void save() {
System.out.println("执行保存数据");
}
}
代理工厂
public class StaticProxy implements UserService{
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public void save() {
System.out.println("开始执行事务");
userService.save();
System.out.println("结束事务");
}
}
测试
public class App {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
StaticProxy staticProxy = new StaticProxy();
staticProxy.setUserService(userService);
staticProxy.save();
}
}
动态代理
public class ProxyFactory {
private UserService target;
public ProxyFactory(UserService userService){
this.target = userService;
}
public Object getInstance(){
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 invoke = method.invoke(target, args);
System.out.println("提交事务");
return invoke;
}
});
}
}
public class TestApp {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) new ProxyFactory(userService).getInstance();
proxy.save();
}
}
Cglib代理
代理工厂 类不需要实现接口
public class ProxyFactory implements MethodInterceptor {
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
public Object getProxyInstance(){
Enhancer en = new Enhancer();
en.setSuperclass(target.getClass());
en.setCallback(this);
return en.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开始执行数据");
Object returnValue = method.invoke(target,objects);
System.out.println("结束执行数据");
return returnValue;
}
}
public class AppTest {
public static void main(String[] args) {
UserDao target = new UserDao();
UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();
proxy.save();
}
}
public class UserDao {
public void save(){
System.out.println("-------------执行保存数据---------");
}
}