詳細了解MVC+proxy
1、創(chuàng)建業(yè)務(wù)層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è)務(wù)層可能含有涉及到多步數(shù)據(jù)庫操作,所以這一步需要開啟事務(wù),但是開發(fā)中這樣的情況太多了,所以我們需要面向橫切面編程,創(chuàng)建代理代理,在調(diào)用業(yè)務(wù)層方法時,我們利用jdk動態(tài)代理的增強功能提供事務(wù)。這樣,事務(wù)代碼只用寫一次,但是每次業(yè)務(wù)層方法調(diào)用時,我們都可以使用代理對象去調(diào)用業(yè)務(wù)層方法來開啟事務(wù)。實現(xiàn)了代碼復(fù)用。
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;
}
}
這里我就用輸出語句代表事務(wù)語句。
5、創(chuàng)建表示層Servlet去完成調(diào)用
public class UserSaveServlet {
public static void main(String[] args) throws Exception {
//需要調(diào)用的目標類
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)建代理對象
//將返回值轉(zhuǎn)為接口類型
UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler);
boolean success=service.save(new User("張三","123456"));
System.out.println(success?"保存成功":"保存失敗");
}
}

總結(jié)
本篇文章就到這里了,希望能夠幫助到你,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
解決springboot運行出現(xiàn)錯誤:找不到或無法加載主類com.xxxx.xxxx.Application問題
文章介紹了在服務(wù)器上運行一個未使用的Java項目時遇到的“找不到或無法加載主類”錯誤,并提供了兩種解決方法:通過Maven install或build …、Goals輸入install并跳過測試來重新構(gòu)建項目2024-11-11
Mybatis mapper.xml使用全局變量的三種實現(xiàn)方法
文章介紹了在Mybatis的Mapper.xml文件中使用全局變量來動態(tài)配置數(shù)據(jù)庫庫名的實現(xiàn)方案,包括使用mybaits自帶全局變量、使用@value和mybatis進行全局變量定義以及使用@value和mybatis進行全局變量定義并減少形參的方案2025-02-02
SpringBoot項目中的多數(shù)據(jù)源支持的方法
本篇文章主要介紹了SpringBoot項目中的多數(shù)據(jù)源支持的方法,主要介紹在SpringBoot項目中利用SpringDataJpa技術(shù)如何支持多個數(shù)據(jù)庫的數(shù)據(jù)源,有興趣的可以了解一下2017-10-10
SpringBoot中@Configuration和@Bean和@Component相同點詳解
這篇文章主要介紹了SpringBoot中@Configuration和@Bean和@Component相同點詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)
這篇文章主要介紹了SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)2023-05-05
Java面向?qū)ο笾甪inal關(guān)鍵字詳細解讀
這篇文章主要介紹了Java面向?qū)ο笾甪inal關(guān)鍵字詳細解讀,final修飾的屬性又叫常量,一般用 XX_XX_XX來命名,final修飾的屬性在定義時必須賦初始值,并且以后不能再修改,需要的朋友可以參考下2024-01-01

