詳細了解MVC+proxy
1、創(chuàng)建業(yè)務層UserService接口定義需要完成的功能
/**
* 創(chuàng)建目標接口,定義目標接口要完成的功能
*/
public interface UserService {
boolean save(User user);
}
2、創(chuàng)建持久層UserDao接口定義具體的CURD
/**
* 創(chuàng)建目標接口,定義目標接口要完成的功能
*/
public interface UserService {
boolean save(User user);
}
3、完成UserService接口和UserDao的實現(xiàn)類
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、創(chuàng)建InvocationHandler接口的實現(xiàn)類
為什么需要這個接口?
因為在開發(fā)中,業(yè)務層可能含有涉及到多步數(shù)據庫操作,所以這一步需要開啟事務,但是開發(fā)中這樣的情況太多了,所以我們需要面向橫切面編程,創(chuàng)建代理代理,在調用業(yè)務層方法時,我們利用jdk動態(tài)代理的增強功能提供事務。這樣,事務代碼只用寫一次,但是每次業(yè)務層方法調用時,我們都可以使用代理對象去調用業(yè)務層方法來開啟事務。實現(xiàn)了代碼復用。
public class UserHandler implements InvocationHandler {
//動態(tài)創(chuàng)建目標對象
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、創(chuàng)建表示層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();
//目標對象實現(xiàn)的接口
Class<?>[] interfaces=obj.getClass().getInterfaces();
//獲取InvocationHandler對象
InvocationHandler handler=new UserHandler(obj);
//創(chuàng)建代理對象
//將返回值轉為接口類型
UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler);
boolean success=service.save(new User("張三","123456"));
System.out.println(success?"保存成功":"保存失敗");
}
}

總結
本篇文章就到這里了,希望能夠幫助到你,也希望您能夠多多關注腳本之家的更多內容!
相關文章
解決springboot運行出現(xiàn)錯誤:找不到或無法加載主類com.xxxx.xxxx.Application問題
文章介紹了在服務器上運行一個未使用的Java項目時遇到的“找不到或無法加載主類”錯誤,并提供了兩種解決方法:通過Maven install或build …、Goals輸入install并跳過測試來重新構建項目2024-11-11
Mybatis mapper.xml使用全局變量的三種實現(xiàn)方法
文章介紹了在Mybatis的Mapper.xml文件中使用全局變量來動態(tài)配置數(shù)據庫庫名的實現(xiàn)方案,包括使用mybaits自帶全局變量、使用@value和mybatis進行全局變量定義以及使用@value和mybatis進行全局變量定義并減少形參的方案2025-02-02
SpringBoot中@Configuration和@Bean和@Component相同點詳解
這篇文章主要介紹了SpringBoot中@Configuration和@Bean和@Component相同點詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringBoot?pdf打印及預覽(openhtmltopdf+freemarker)
這篇文章主要介紹了SpringBoot?pdf打印及預覽(openhtmltopdf+freemarker)2023-05-05

