动态代理使用的一点小总结

动态代理

1.接口 :定义方法名
2.实现类(即被代理对象) implements 接口 :定义方法体
3.动态代理工厂类 implements InvocationHandler
目的:生产代理对象,加强被代理对象方法
具体:

    ① 定义成员变量(实现类对象)
    ② 有参构造(将实现类对象作为参数传入)
    ③ 提供方法获得代理对象(代理对象类型为接口)
 			(接口)Proxy.newProxyInstance(动态代理工厂类.class.getClassLoader,
 			 实现类.class.getInterfaces, this);   
             注:this代表当前对象,即动态代理工厂类对象(它实现了InvocationHandler)可以让代理对象执行工厂类的invoke
    ④ 重写invoke方法  加强方法+method.invoke(实现类对象,args)

4.使用

① 创建实现类对象
② 创建动态代理工厂对象,有参构造传入实现类对象
③ 通过动态代理工厂获得代理对象
④  动态代理对象执行方法

例子

//1.接口UserService
public interface UserService {
         void save()
}

//2.实现类UserServiceImpl
public class UserServiceImpl implements UserService {
        @Override
        public void save() {
        System.out.println("保存用户");
        }
}

//3.动态代理工厂类
public class UserServiceProxyFactory implements InvocationHandler {

 	//① 定义成员变量(实现类对象)
	private UserServiceImpl us;   

    // ② 有参构造(将实现类对象作为参数传入)
	public UserServiceProxyFactory(UserServiceImpl us) {    
   		 this.us = us;           
	}

	//③提供方法获得代理对象(代理对象类型为接口)
	public UserService getUserServiceProxy(){
   		 //生成动态代理
   		 //Proxy.newProxyInstance(动态代理工厂类.class.getClassLoader,
 			 实现类.class.getInterfaces, this);   
 			 
   		 UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
          						UserServiceImpl.class.getInterfaces(), this);      	
   		 return usProxy;
    }
    
    //④ 重写invoke方法 
	@Override 
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	System.out.println("打开事务");
    	Object invoke = method.invoke(us, args);        //method.invoke(实现类对象,args)
    	System.out.println("提交事务");
    	return invoke;
	 }
}
//4.使用
    @Test
	public void fun1(){
	     // ① 创建实现类对象
   		 UserServiceImpl us = new UserServiceImpl();
   		 // ② 创建动态代理工厂对象,有参构造传入实现类对象
    	 UserServiceProxyFactory factory = new UserServiceProxyFactory(us);
    	 // ③ 通过动态代理工厂获得代理对象
    	 UserService proxy = factory.getUserServiceProxy();
    	 // ④  动态代理对象执行方法
    	 proxy.save();     
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值