詳細瞭解MVC+proxy

1、創建業務層UserService接口定義需要完成的功能

/**
 * 創建目標接口,定義目標接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

2、創建持久層UserDao接口定義具體的CURD

/**
 * 創建目標接口,定義目標接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

3、完成UserService接口和UserDao的實現類

public class UserServiceImpl implements UserService {
    private UserDao dao=new UserDaoImpl();
    @Override
    public boolean save(User user) {
        boolean success=false;
        success=dao.insert(user);
        return success;
    }
}

這裡省略具體的JDBC代碼

public class UserDaoImpl implements UserDao {
    @Override
    public boolean insert(User user) {
        System.out.println("insert into t_user (username,password)values('"+user.getUsername()+"','"+user.getPassword()+"')");
        return true;
    }
}

4、創建InvocationHandler接口的實現類

為什麼需要這個接口?

因為在開發中,業務層可能含有涉及到多步數據庫操作,所以這一步需要開啟事務,但是開發中這樣的情況太多瞭,所以我們需要面向橫切面編程,創建代理代理,在調用業務層方法時,我們利用jdk動態代理的增強功能提供事務。這樣,事務代碼隻用寫一次,但是每次業務層方法調用時,我們都可以使用代理對象去調用業務層方法來開啟事務。實現瞭代碼復用。

public class UserHandler implements InvocationHandler {

    //動態創建目標對象
    Object target=null;
    public UserHandler(Object target){
        this.target=target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //返回值
        Object result=null;
        //增強功能
        System.out.println("begin Transaction.....");
        result=result=method.invoke(target,args);
        System.out.println("commit Transaction.....");
        System.out.println("rollback Transaction.....");
        System.out.println("end Transaction.....");
        //返回值
        return result;
    }
}

這裡我就用輸出語句代表事務語句。

5、創建表示層Servlet去完成調用

public class UserSaveServlet {
    public static void main(String[] args) throws Exception {
        //需要調用的目標類
        Class c= UserServiceImpl.class;
        Object obj = c.newInstance();
        //獲取該類的類加載器
        ClassLoader loader = obj.getClass().getClassLoader();
        //目標對象實現的接口
        Class<?>[] interfaces=obj.getClass().getInterfaces();
        //獲取InvocationHandler對象
        InvocationHandler handler=new UserHandler(obj);
        //創建代理對象
        //將返回值轉為接口類型
        UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler);
        boolean success=service.save(new User("張三","123456"));
        System.out.println(success?"保存成功":"保存失敗");
    }
}

總結

本篇文章就到這裡瞭,希望能夠幫助到你,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: