java動態代理

1. 建立一個接口ide

public interface UserService {
    void save();
    void delete();
    void update();
    void find();
}

2.建立一個接口的實現類測試

public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用戶!");
        //int i = 1/0;
    }
    @Override
    public void delete() {
        System.out.println("刪除用戶!");
    }
    @Override
    public void update() {
        System.out.println("更新用戶!");
    }
    @Override
    public void find() {
        System.out.println("查找用戶!");
    }
}

介紹下爲何要使用動態代理.由於接口實現類中,這4個方法都執行的時候 想調用同一個方法.可是寫4次就有點不符合設計.this

因此使用動態代理 只寫一次就能夠了spa

3.建立動態代理的類設計

public class UserServiceProxyFactory implements InvocationHandler {
    
    public UserServiceProxyFactory(UserService us) {
        super();
        this.us = us;
    }

    private UserService us;
    
    public UserService getUserServiceProxy(){
        //生成動態代理
        UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
                                    UserServiceImpl.class.getInterfaces(), 
                                    this);
        //返回
        return usProxy;
        
    }

    @Override
    public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
        System.out.println("打開事務!");
        Object invoke = method.invoke(us, arg2);
        System.out.println("提交事務!");
        return invoke;
    }

}

4.測試動態代理代理

@Test
    //動態代理
    public void fun1(){
        UserService us = new UserServiceImpl();
        
        UserServiceProxyFactory factory = new UserServiceProxyFactory(us);
        
        UserService usProxy = factory.getUserServiceProxy();
        
        usProxy.save();
        
        //代理對象與被代理對象實現了相同的接口
        //代理對象 與 被代理對象沒有繼承關係
        System.out.println(usProxy instanceof UserServiceImpl );//false
    }
相關文章
相關標籤/搜索