代理模式:
1.代理对象应该实现和被代理者相同的接口
2.做一些额外的操作(例如数据库中的事务)
1.静态代理的缺点
1:虽然做到的了代码分离 但是代理的复用性依然很差
2:一个实体对象就得写一个静态单例 非常麻烦(实际中不用)
@Component("userService")
public class StaticProxy implements UserService{
@Resource
private UserService target;
@Resource
private TransactionManager tx;
@Override
public void addUser(User user) {
try{
tx.begin();
target.addUser(user);
tx.commit();
}catch (Exception e) {
tx.rollBack();
}
}
@Override
public void delUser(int id) {
try{
tx.begin();
target.delUser(id);
tx.commit();
}catch (Exception e) {
tx.rollBack();
}
}
}
2.动态代理模式
1.JDK的动态代理模式
2.Cglib动态代理
不同点:
1.JDK的动态代理必须实现接口,才能生成代理对象
2.Cglib有无接口都能生成代理对象,并且代理对象是目标对象的子类
3.代理模式的缺点:
1.当只传入事务处理的代码时,代理对象只能处理事务逻辑
2.所有的方法都比给添加了事务。这样做并不合理。
3.代码的可读性不好并且复用性也不好
1.JDK的动态代理模式
public class BeanFactoryProxy {
public static Object getProxy(final Object target, final TransactionManager tx){
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try{
tx.begin();
result = method.invoke(target, args);
tx.commit();
}catch (Exception e) {
tx.rollBack();
}
return result;
}
});
return proxy;
}
}
2.Cglib动态代理
@Component
public class BeanFactoryProxy {
public static Object getProxy(final Object target, final TransactionManager tx){
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(target.getClass().getInterfaces());
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object result= null;
try{
tx.begin();
result = method.invoke(target, args);
tx.commit();
}catch (Exception e) {
tx.rollBack();
}
return result;
}
});
return enhancer.create();
}
}