java?使用BeanFactory實(shí)現(xiàn)service與dao層解耦合詳解
BeanFactory實(shí)現(xiàn)service與dao層解耦合
在實(shí)際網(wǎng)站開發(fā)過程中,在service會(huì)new一個(gè)dao從而調(diào)用該dao中的方法,如下代碼,但是一旦更換數(shù)據(jù)庫需要改變dao的指向,此時(shí)就需要重新部署新的項(xiàng)目
UserDao UserDao=new UserDaoImpl();
在本文中使用BeanFactory的方式,在xml中配置dao的指向,一旦發(fā)生變化,無需重新部署,只需要改變xml中的配置即可,代碼如下:
UserDao UserDao=(UserDao)BeanFactory.createObject("UserDao");
全部實(shí)現(xiàn)代碼如下,請重點(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)建對象并返回。
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)注冊功能
UserDao.userRegist(user);
}
@Override
public boolean userActive(String code) throws SQLException {
//實(shí)現(xiàn)注冊功能
///對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);
//對數(shù)據(jù)庫執(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 {
//通過傳遞過來的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é)點(diǎn) beans
Element rootElement = doc.getRootElement();
//通過根節(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");
//通過反射創(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層實(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)文章
java序列化對象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟
這篇文章主要介紹了使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet
這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個(gè)Map,下文圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考參考一下2022-05-05
maven升級版本后報(bào)錯(cuò):Blocked mirror for repositories
本文主要介紹了maven升級版本后報(bào)錯(cuò):Blocked mirror for repositories,文中的解決方法非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
Java?Mybatis查詢數(shù)據(jù)庫舉例詳解
這篇文章主要給大家介紹了關(guān)于Java?Mybatis查詢數(shù)據(jù)庫的相關(guān)資料,在MyBatis中可以使用遞歸查詢實(shí)現(xiàn)對數(shù)據(jù)庫中樹形結(jié)構(gòu)數(shù)據(jù)的查詢,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

