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

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

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

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

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

UserDao UserDao=new UserDaoImpl();

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

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

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

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

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

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 {
  //實(shí)現(xiàn)注冊(cè)功能  
  UserDao.userRegist(user);  
 }
 
 @Override
 public boolean userActive(String code) throws SQLException {
  //實(shí)現(xiàn)注冊(cè)功能
  
  ///對(duì)DB發(fā)送select * from user where code=?
  User user=UserDao.userActive(code);  
  if(null!=user){
   //可以根據(jù)激活碼查詢到一個(gè)用戶
   //修改用戶的狀態(tài),清除激活碼
   user.setState(1);
   user.setCode(null);
   //對(duì)數(shù)據(jù)庫(kù)執(zhí)行一次真實(shí)的更新操作  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ù)激活碼查詢到一個(gè)用戶
   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 {
   //通過(guò)傳遞過(guò)來(lái)的name獲取application.xml中name對(duì)應(yīng)的class值
   
   //獲取到Document對(duì)象
   SAXReader reader=new SAXReader();
   //如果獲取application.xml文件的輸入流 (application.xml必須位于src下)
   InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("application.xml");
   Document doc=reader.read(is);
   //通過(guò)Document對(duì)象獲取根節(jié)點(diǎn)  beans
   Element rootElement = doc.getRootElement();
   //通過(guò)根節(jié)點(diǎn)獲取到根節(jié)點(diǎn)下所有的子節(jié)點(diǎn) bean,返回集合
   List<Element> list = rootElement.elements();
   //遍歷集合,判斷每個(gè)元素上的id的值是否和當(dāng)前的name一致
   for (Element ele : list) {
    //ele相當(dāng)于beans節(jié)點(diǎn)下的每個(gè)bean
    //獲取到當(dāng)前節(jié)點(diǎn)的id屬性值
    //如果一致,獲取到當(dāng)前元素上class屬性值
    String id=ele.attributeValue("id");
    if(id.equals(name)){
     String str=ele.attributeValue("class");
     //通過(guò)反射創(chuàng)建對(duì)象并且返回
     Class clazz=Class.forName(str);
     //利用class值通過(guò)反射創(chuàng)建對(duì)象返回
     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層實(shí)現(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;
 }
}

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

相關(guān)文章

  • SpringAOP中的通知Advice詳解

    SpringAOP中的通知Advice詳解

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

    java中對(duì)HashMap的put過(guò)程解讀

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

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

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

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

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

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

    這篇文章主要介紹了Java中為什么不同的返回類型不算方法重載,方法重載是指在同一個(gè)類中,定義了多個(gè)同名方法,但每個(gè)方法的參數(shù)類型或者是參數(shù)個(gè)數(shù)不同就是方法重載,下文詳細(xì)介紹,需要的小伙伴可以參考一下
    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即屬于一個(gè)Map,下文圍繞主題展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考參考一下
    2022-05-05
  • maven升級(jí)版本后報(bào)錯(cuò):Blocked mirror for repositories

    maven升級(jí)版本后報(bào)錯(cuò):Blocked mirror for repositories

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

    解決SpringBoot掃描不到公共類的實(shí)體問(wèn)題

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

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

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

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

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

最新評(píng)論

阳城县| 荆州市| 公安县| 安顺市| 甘泉县| 修水县| 乌兰浩特市| 沽源县| 壤塘县| 桐庐县| 大足县| 华蓥市| 白山市| 常宁市| 皋兰县| 宣城市| 仁布县| 平阴县| 潮州市| 庄浪县| 阿坝| 阿拉善左旗| 和顺县| 建湖县| 安平县| 锡林郭勒盟| 齐河县| 杭州市| 溧阳市| 凉城县| 论坛| 北海市| 获嘉县| 湘阴县| 北安市| 穆棱市| 剑河县| 惠安县| 交城县| 上高县| 沧源|