欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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對應的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的值是否和當前的name一致
   for (Element ele : list) {
    //ele相當于beans節(jié)點下的每個bean
    //獲取到當前節(jié)點的id屬性值
    //如果一致,獲取到當前元素上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);
    //將字符流,相當于Connection
    factory= new SqlSessionFactoryBuilder().build(reader);
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return factory;
 }
}

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

相關(guān)文章

  • Spring事件監(jiān)聽源碼解析流程分析

    Spring事件監(jiān)聽源碼解析流程分析

    spring事件監(jiān)聽機制離不開容器IOC特性提供的支持,比如容器會自動創(chuàng)建事件發(fā)布器,自動識別用戶注冊的監(jiān)聽器并進行管理,在特定的事件發(fā)布后會找到對應的事件監(jiān)聽器并對其監(jiān)聽方法進行回調(diào),這篇文章主要介紹了Spring事件監(jiān)聽源碼解析,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于MD5算法原理與常用實現(xiàn)方式

    關(guān)于MD5算法原理與常用實現(xiàn)方式

    這篇文章主要介紹了關(guān)于MD5算法原理與常用實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 教你用Java Swing做一個定時提醒工具

    教你用Java Swing做一個定時提醒工具

    今天給大家?guī)淼氖荍ava的相關(guān)知識,文章圍繞著如何用Java做一個定時提醒工具展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Springboot之日志、配置文件、接口數(shù)據(jù)如何脫敏

    Springboot之日志、配置文件、接口數(shù)據(jù)如何脫敏

    本文主要介紹了Springboot之配置文件數(shù)據(jù)脫敏、接口返回數(shù)據(jù)脫敏、日志文件數(shù)據(jù)脫敏三個方面,需要了解學習的小伙伴快跟隨小編的腳步一起去看看吧
    2021-09-09
  • mybatis3.3+struts2.3.24+mysql5.1.22開發(fā)環(huán)境搭建圖文教程

    mybatis3.3+struts2.3.24+mysql5.1.22開發(fā)環(huán)境搭建圖文教程

    這篇文章主要為大家詳細介紹了mybatis3.3+struts2.3.24+mysql5.1.22開發(fā)環(huán)境搭建圖文教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringCloud整合Consul的實現(xiàn)

    SpringCloud整合Consul的實現(xiàn)

    這篇文章主要介紹了SpringCloud整合Consul的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java的枚舉enum示例詳解

    Java的枚舉enum示例詳解

    這篇文章主要給大家介紹了關(guān)于Java的枚舉enum的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • java使用this調(diào)用構(gòu)造函數(shù)的實現(xiàn)方法示例

    java使用this調(diào)用構(gòu)造函數(shù)的實現(xiàn)方法示例

    這篇文章主要介紹了java使用this調(diào)用構(gòu)造函數(shù)的實現(xiàn)方法,結(jié)合實例形式分析了java面向?qū)ο蟪绦蛟O(shè)計中函數(shù)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • 設(shè)計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解

    設(shè)計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解

    這篇文章主要介紹了組合模式及其在JDK和MyBatis源碼中的運用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java語言之LinkedList和鏈表的實現(xiàn)方法

    Java語言之LinkedList和鏈表的實現(xiàn)方法

    LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語言之LinkedList和鏈表的實現(xiàn)方法,需要的朋友可以參考下
    2023-05-05

最新評論