5-(E-Teller源代码分析)LocalDirectorySessionFactoryBean

本文介绍了一个Spring Hibernate配置文件的加载工具类,支持多目录加载及jar包内的配置文件注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * Created on 2007-1-9 19:53:40 by mlrain
 */
package cn.com.agree.web.tapestry.presentation.spring;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.mlstudio.util.StringUtil;
//mlrain的实用工具集
import org.mlstudio.util.file.FileListUtil;
import org.mlstudio.util.file.filter.WildcardFileFilter;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.orm.hibernate.LocalSessionFactoryBean;
import org.springframework.util.ResourceUtils;

/**
 * 加载指定目录下的Hibernate配置文件的工具类。 <BR>
 * 支持多目录。<BR>
 * <ul>
 * version 1.1.0
 * <li>支持直接注册hbm配置文件</li>
 * <li>支持jar包中hbm配置文件的注册,但仅限于注册具体的hbm配置文件,不支持目录注册</li>
 * </ul>
 * <ul>
 * version 1.1.1
 * <li>增加Websphere中wsjar协议的支持</li>
 * </ul>
 *
 * @author mlrain
 * @version 1.1.1, 2007-7-17 13:24:40
 */
//这里LocalSessionFactoryBean是一个Factory用来生成Bean
public class LocalDirectorySessionFactoryBean extends LocalSessionFactoryBean
{
    /**
     * Logger
     */
    private Logger logger = Logger.getLogger(getClass());

    /**
     * URL协议:jar。
     *
     * @since version 1.1.0
     */
    public static final String URL_PROTOCOL_JAR = "jar";

    /**
     * URL协议:wsjar
     *
     * @since version 1.1.1
     */
    public static final String URL_PROTOCOL_WSJAR = "wsjar";

    /**
     * 加载指定目录下的Hibernate配置文件。
     *
     * @param mappingResourcesDirectory
     */
   //在spring配置文件中会配置mappingResourcesDirectory属性,就是指明一个目录
  //是一个数组
    public void setMappingResourcesDirectories(
            String[] mappingResourcesDirectories)
    {
        try
        {
            if (mappingResourcesDirectories == null
                    || mappingResourcesDirectories.length == 0)
            {
                logger.error("Hibernate配置文件目录为空!");
                return;
            }

            // 获取各目录下的配置文件
            List mappingFiles = new ArrayList();
            // 1 row(s) below added by mlrain @2007-6-7 下午09:36:24
            // for: 增加对jar包中的配置文件的支持,@since version 1.1.0
            List jarMappingFiles = new ArrayList(); // 存放在jar包中的配置文件列表
            
             //只选择*.hbm.xml
            FileListUtil.filter = new WildcardFileFilter("*.hbm.xml");
            for (int i = 0; i < mappingResourcesDirectories.length; ++i)
            {
                String thisDir = mappingResourcesDirectories[i];
                if (StringUtil.empty(thisDir))
                    continue;

                thisDir = thisDir.trim();

                // 获取配置文件目录
                ClassLoader cl = Thread.currentThread().getContextClassLoader();
                URL url = cl.getResource(thisDir);
                // 5 row(s) below added by mlrain @2007-6-7 上午10:39:07
                // for: 增加未找到URL的判断,修正抛异常的BUG
                if (url == null)
                {
                    logger.warn("指定路径[" + thisDir + "]不存在!");
                    continue;
                }

                // 3 row(s) below added by mlrain @2007-6-7 下午09:46:13
                // for: 增加对jar包中配置文件的支持,@since version 1.1.0
                if (isJarResource(url))
                    jarMappingFiles.add(url);
                else
                {
                    File fDir = ResourceUtils.getFile(url);

                    // 3 row(s) below added by mlrain @2007-6-7 下午09:48:06
                    // for: 增加对hbm配置文件的直接注册,@since version 1.1.0
                    if (fDir.isFile())
                        mappingFiles.add(fDir);
                    else
                    {
                        // 获取配置文件列表
                        List list = FileListUtil.getChildrenFile(fDir);
                        mappingFiles.addAll(list);
                    }

                }
            }

            // 1 row(s) below edited by mlrain @2007-6-11 下午07:37:00
            // for: 只有两种情况都没有找到配置文件时才打印警告信息
            if (mappingFiles.size() == 0 && jarMappingFiles.size() == 0)
                // if (mappingFiles.size() == 0)
                logger.warn("在指定的Hibernate配置文件目录下未找到任何配置文件!");

            // 建立配置文件资源数组
            // 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
            // for: 增加对jar包中配置文件的支持,@since version 1.1.0
            List resourceList = new ArrayList(); // 资源列表
            // Resource[] mappingResources = new Resource[mappingFiles.size()];
            for (int i = 0; i < mappingFiles.size(); ++i)
            {
                File file = (File) mappingFiles.get(i);
                // 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
                // for: 增加对jar包中配置文件的支持,@since version 1.1.0
                resourceList.add(new FileSystemResource(file));
                // mappingResources[i] = new FileSystemResource(file);
            }

            // 5 row(s) below added by mlrain @2007-6-7 下午09:52:47
            // for: 增加对jar包中配置文件的支持,@since version 1.1.0
            for (int i = 0; i < jarMappingFiles.size(); ++i)
            {
                URL url = (URL) jarMappingFiles.get(i);
                resourceList.add(new UrlResource(url));
            }

            // 设置给资源变量
            // 1 row(s) below added by mlrain @2007-6-7 下午09:51:24
            // for: 增加对jar包中配置文件的支持,@since version 1.1.0
            Resource[] mappingResources = (Resource[]) resourceList
                    .toArray(new Resource[0]);
           //调用了内部的setMappingLocations方法
            setMappingLocations(mappingResources);
        } catch (Exception e)
        {
            logger.error("注册Hibernate配置文件出错!", e);
        }
    }

    private boolean isJarResource(URL url)
    {
        if (url == null)
            return false;

        // 1 row(s) below edited by mlrain @2007-7-17 下午01:25:20
        // for: 增加对Websphere中wsjar协议的支持
        // return URL_PROTOCOL_JAR.equals(url.getProtocol());
        //通过url.getProtocol()来判断文件是否来自jar
        return URL_PROTOCOL_JAR.equals(url.getProtocol())
                || URL_PROTOCOL_WSJAR.equals(url.getProtocol());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值