代理模式

代理模式

代理模式就是再不改边目标对象的情况下对目标对象进行扩展

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();
	} 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值