最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java?使用BeanFactory實現(xiàn)service與dao層解耦合詳解

 更新時間:2021年12月04日 08:47:37   作者:夏沐_lk  
這篇文章主要介紹了java?使用BeanFactory實現(xiàn)service與dao層解耦合詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

BeanFactory實現(xiàn)service與dao層解耦合

在實際網(wǎng)站開發(fā)過程中,在service會new一個dao從而調(diào)用該dao中的方法,如下代碼,但是一旦更換數(shù)據(jù)庫需要改變dao的指向,此時就需要重新部署新的項目

UserDao UserDao=new UserDaoImpl();

在本文中使用BeanFactory的方式,在xml中配置dao的指向,一旦發(fā)生變化,無需重新部署,只需要改變xml中的配置即可,代碼如下:

UserDao UserDao=(UserDao)BeanFactory.createObject("UserDao");

全部實現(xiàn)代碼如下,請重點關(guān)注解耦思想,即關(guān)注BeanFactory中的實現(xiàn)

整體的實現(xiàn)思路是

UserServiceImp調(diào)用BeanFactory中的createObject("UserDao")方法----》在BeanFactory中解析xml文件,獲取xml中id與UserDao相同的節(jié)點,并獲取該節(jié)點上的class文件----》利用反射機制創(chuàng)建對象并返回。

UserServiceImp.java

package cn.itcast.store.service.serviceImp; 
import java.sql.SQLException; 
import cn.itcast.store.dao.UserDao;
import cn.itcast.store.dao.daoImp.UserDaoImp;
import cn.itcast.store.domain.User;
import cn.itcast.store.service.UserService;
import cn.itcast.store.utils.BeanFactory; 
public class UserServiceImp implements UserService {
 UserDao UserDao=(UserDao)BeanFactory.createObject("UserDao"); 
 
 @Override
 public void userRegist(User user) throws SQLException {
  //實現(xiàn)注冊功能  
  UserDao.userRegist(user);  
 }
 
 @Override
 public boolean userActive(String code) throws SQLException {
  //實現(xiàn)注冊功能
  
  ///對DB發(fā)送select * from user where code=?
  User user=UserDao.userActive(code);  
  if(null!=user){
   //可以根據(jù)激活碼查詢到一個用戶
   //修改用戶的狀態(tài),清除激活碼
   user.setState(1);
   user.setCode(null);
   //對數(shù)據(jù)庫執(zhí)行一次真實的更新操作  update user set state=1 , code=null where uid=?
   //update user set username=? , password=? ,name =? ,email=?, telephone =? ,birthday =? ,sex=? ,state=? ,code= ? where uid=?
   UserDao.updateUser(user);
   return  true;
  }else{
   //不可以根據(jù)激活碼查詢到一個用戶
   return false;
  }
 }
 
 @Override
 public User userLogin(User user) throws SQLException {
  //此處:可以利用異常在模塊之間傳遞數(shù)據(jù)   
  
  //select * from user where username=? and password=?
  User uu=UserDao.userLogin(user);
  if(null==uu){
   throw new RuntimeException("密碼有誤!");
  }else if(uu.getState()==0){
   throw new RuntimeException("用戶未激活!");
  }else{
   return uu;
  }
 } 
}

BeanFactory.java

package cn.itcast.store.utils; 
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List; 
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; 
import cn.itcast.store.dao.UserDao;
import cn.itcast.store.domain.User; 
public class BeanFactory { 
 
 //解析XML
 public static Object createObject(String name) {
  try {
   //通過傳遞過來的name獲取application.xml中name對應(yīng)的class值
   
   //獲取到Document對象
   SAXReader reader=new SAXReader();
   //如果獲取application.xml文件的輸入流 (application.xml必須位于src下)
   InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("application.xml");
   Document doc=reader.read(is);
   //通過Document對象獲取根節(jié)點  beans
   Element rootElement = doc.getRootElement();
   //通過根節(jié)點獲取到根節(jié)點下所有的子節(jié)點 bean,返回集合
   List<Element> list = rootElement.elements();
   //遍歷集合,判斷每個元素上的id的值是否和當(dāng)前的name一致
   for (Element ele : list) {
    //ele相當(dāng)于beans節(jié)點下的每個bean
    //獲取到當(dāng)前節(jié)點的id屬性值
    //如果一致,獲取到當(dāng)前元素上class屬性值
    String id=ele.attributeValue("id");
    if(id.equals(name)){
     String str=ele.attributeValue("class");
     //通過反射創(chuàng)建對象并且返回
     Class clazz=Class.forName(str);
     //利用class值通過反射創(chuàng)建對象返回
     return  clazz.newInstance();     
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 
 public static void main(String[] args) throws SQLException {
  UserDao ud=(UserDao)BeanFactory.createObject("UserDao");
  User user=new User();
  user.setUsername("aaa");
  user.setPassword("aaa");
  User uu = ud.userLogin(user);
  System.out.println(uu);
 } 
}

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
   <bean id="CategoryDao" class="cn.itcast.store.dao.daoImp.CategoryDaoImp"/>
   <bean id="UserDao" class="cn.itcast.store.dao.daoImp.UserDaoImp"/>
   <bean id="ProductDao" class="cn.itcast.store.dao.daoImp.ProductDaoImp"/>
</beans>

DAO層實現(xiàn)類CreatFactory.java

public class CreatFactory {
 //單例模式 
 private static SqlSessionFactory factory=null;
 public static SqlSessionFactory creatFactory(){
  if(factory==null){
   //加載配置文件
   String resource = "mybatis/config.xml";//配置文件地址
   //讀取文件resource,變成字符流
   Reader reader;
   try {
    reader = Resources.getResourceAsReader(resource);
    //將字符流,相當(dāng)于Connection
    factory= new SqlSessionFactoryBuilder().build(reader);
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return factory;
 }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringAOP中的通知Advice詳解

    SpringAOP中的通知Advice詳解

    這篇文章主要介紹了SpringAOP中的通知Advice詳解,Spring 的 AOP 功能中一個關(guān)鍵概念是通知Advice與切點Pointcut表達式相關(guān)聯(lián)在特定節(jié)點織入一些邏輯,Spring 提供了五種類型的通知,需要的朋友可以參考下
    2023-08-08
  • java中對HashMap的put過程解讀

    java中對HashMap的put過程解讀

    這篇文章主要介紹了java中對HashMap的put過程解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java序列化對象根據(jù)不同配置動態(tài)改變屬性名的方法

    java序列化對象根據(jù)不同配置動態(tài)改變屬性名的方法

    本文主要介紹了java序列化對象根據(jù)不同配置動態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 使用jekins自動構(gòu)建部署java maven項目的方法步驟

    使用jekins自動構(gòu)建部署java maven項目的方法步驟

    這篇文章主要介紹了使用jekins自動構(gòu)建部署java maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java中為什么不同的返回類型不算方法重載

    Java中為什么不同的返回類型不算方法重載

    這篇文章主要介紹了Java中為什么不同的返回類型不算方法重載,方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數(shù)類型或者是參數(shù)個數(shù)不同就是方法重載,下文詳細介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個Map,下文圍繞主題展開詳細內(nèi)容,需要的小伙伴可以參考參考一下
    2022-05-05
  • maven升級版本后報錯:Blocked mirror for repositories

    maven升級版本后報錯:Blocked mirror for repositories

    本文主要介紹了maven升級版本后報錯:Blocked mirror for repositories,文中的解決方法非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 解決SpringBoot掃描不到公共類的實體問題

    解決SpringBoot掃描不到公共類的實體問題

    這篇文章主要介紹了解決SpringBoot掃描不到公共類的實體問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot讀寫操作yml配置文件方法

    SpringBoot讀寫操作yml配置文件方法

    之前一直用的application.properties配置文件,只能是KV結(jié)構(gòu),后來的yml配置文件更像是樹狀結(jié)構(gòu),支持層級,比properties更靈活
    2023-01-01
  • Java?Mybatis查詢數(shù)據(jù)庫舉例詳解

    Java?Mybatis查詢數(shù)據(jù)庫舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java?Mybatis查詢數(shù)據(jù)庫的相關(guān)資料,在MyBatis中可以使用遞歸查詢實現(xiàn)對數(shù)據(jù)庫中樹形結(jié)構(gòu)數(shù)據(jù)的查詢,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10

最新評論

洪洞县| 砀山县| 如东县| 武强县| 广安市| 东至县| 崇左市| 绥阳县| 扶风县| 桐柏县| 乃东县| 福海县| 铜川市| 桃园县| 裕民县| 图片| 嘉定区| 安泽县| 手机| 策勒县| 巴马| 山阴县| 福泉市| 常德市| 东山县| 桦甸市| 泽普县| 南雄市| 衡东县| 襄垣县| 惠东县| 新巴尔虎右旗| 西丰县| 金秀| 临沭县| 嘉义县| 大余县| 镇远县| 正镶白旗| 榆林市| 珲春市|