java 使用BeanFactory实现service与dao层解耦合详解

2022-07-20,,,,

目录
  • beanfactory实现service与dao层解耦合
    • 整体的实现思路是
  • dao层实现类creatfactory.java

    beanfactory实现service与dao层解耦合

    在实际网站开发过程中,在service会new一个dao从而调用该dao中的方法,如下代码,但是一旦更换数据库需要改变dao的指向,此时就需要重新部署新的项目

    userdao userdao=new userdaoimpl();

    在本文中使用beanfactory的方式,在xml中配置dao的指向,一旦发生变化,无需重新部署,只需要改变xml中的配置即可,代码如下:

    userdao userdao=(userdao)beanfactory.createobject("userdao");

    全部实现代码如下,请重点关注解耦思想,即关注beanfactory中的实现

    整体的实现思路是

    userserviceimp调用beanfactory中的createobject("userdao")方法----》在beanfactory中解析xml文件,获取xml中id与userdao相同的节点,并获取该节点上的class文件----》利用反射机制创建对象并返回。

    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 {
      //实现注册功能  
      userdao.userregist(user);  
     }
     
     @override
     public boolean useractive(string code) throws sqlexception {
      //实现注册功能
      
      ///对db发送select * from user where code=?
      user user=userdao.useractive(code);  
      if(null!=user){
       //可以根据激活码查询到一个用户
       //修改用户的状态,清除激活码
       user.setstate(1);
       user.setcode(null);
       //对数据库执行一次真实的更新操作  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{
       //不可以根据激活码查询到一个用户
       return false;
      }
     }
     
     @override
     public user userlogin(user user) throws sqlexception {
      //此处:可以利用异常在模块之间传递数据   
      
      //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对象获取根节点  beans
       element rootelement = doc.getrootelement();
       //通过根节点获取到根节点下所有的子节点 bean,返回集合
       list<element> list = rootelement.elements();
       //遍历集合,判断每个元素上的id的值是否和当前的name一致
       for (element ele : list) {
        //ele相当于beans节点下的每个bean
        //获取到当前节点的id属性值
        //如果一致,获取到当前元素上class属性值
        string id=ele.attributevalue("id");
        if(id.equals(name)){
         string str=ele.attributevalue("class");
         //通过反射创建对象并且返回
         class clazz=class.forname(str);
         //利用class值通过反射创建对象返回
         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层实现类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;
     }
    }
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    《java 使用BeanFactory实现service与dao层解耦合详解.doc》

    下载本文的Word格式文档,以方便收藏与打印。