代理模式
代理模式就是再不改边目标对象的情况下对目标对象进行扩展
jdk动态代理
1.事务管理者接口
public interface ITxManager {
public void begin();
public void commit();
public void close();
}
2.事务管理者实现类
@Component
public class TxManager implements ITxManager {
@Override
public void begin() {
System.out.println("开始");
}
@Override
public void commit() {
System.out.println("提交");
}
@Override
public void close() {
System.out.println("关闭");
}
}
3.创建动态代理工厂
public class ProxyFactory {
//代理对象的增强事务
private ITxManager txManager;
//目标对象
private Object traget;
//代理工厂构造器
public ProxyFactory(ITxManager txManager,Object traget){
this.txManager=txManager;
this.traget=traget;
}
//invocationHandler拦截代理对象的所有请求,并调用方法
//创建代理对象的方法
public Object creatProxy(){
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(),
traget.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
txManager.begin();
//调用目标对象中的方法
method.invoke(traget);
txManager.commit();
txManager.close();
return null;
}
});
return o;
}
}
4.目标对象实现的接口
public interface IUserService {
public void save();
}
5.目标对象
@Service
public class UserService implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public void save() {
userDao.save();
}
}
6.创建目标对象的代理对象
@Controller
public class UserController {
@Autowired
private IUserService userService;
@Autowired
private TxManager txManager;
public void save(){
ProxyFactory proxyFactory = new ProxyFactory(txManager, userService);
IUserService proxy = (IUserService)proxyFactory.creatProxy();
proxy.save();
}
}
7.代理对象也是目标对象接口的实现类
CGLIB动态代理
public class CglibProxy implements MethodInterceptor{
//定义参数,接收真实的目标对象
private Object targetObject;
//事务对象
private TxManager txManager;
public CglibProxy(Object targetObject,TxManager txManager) {
this.targetObject = targetObject;
this.txManager = txManager;
}
/**
* proxyObject:CGLIB代理后的对象,一般不用
* method:真实对象的方法
* args:方法的参数
* methodProxy:CGLIB代理后的方法,一般不用
*/
@Override
public Object intercept(Object proxyObject, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {
Object result = null; //返回的结果
try {
txManager.begin();
result = method.invoke(targetObject, args); //执行直接对象的方法
txManager.commit();
} catch (Exception e) {
txManager.rollback();
e.printStackTrace();
}finally{
txManager.close();
}
return result;
}
/**
* 创建一个代理对象
* @return
*/
public Object createProxy(){
//创建增强器
Enhancer enhancer = new Enhancer();
//创建的代理就是咱们真实目标对象的子类
enhancer.setSuperclass(targetObject.getClass());
//MethodInterceptor就是一个Callback回调
enhancer.setCallback(this);
//创建一个代理对象并返回
return enhancer.create();
}
}