记录--BeanFactory中加载properties文件键值对顺序不对导致的service层反射创建dao实现类失败的问题

顺序加载properties文件

最近在学习BeanFactory这块儿时,遇到了问题:

  • 在表现层通过使用BeanFactory类获取一个业务层serviceImpl对象。
  • 在BeanFactory中使用静态代码块去预先读取properties配置文件,将所有键值对的对应对象创建出来放入Map容器。
  • 最后在BeanFactory中创建一个get方法,通过传入的name参数,获取BeanFactory类中Map容器里对应name的对象。
  • 但是由于在业务层serviceImpl中同样调用了BeanFactory类去创建持久层daoImpl,导致在BeanFactory类的静态代码块中根据properties文件读取的键值对信息去反射创建对象时,先读取并创建的是业务层serviceImpl,而业务层serviceImpl的创建必然会导致其中的成员变量持久层daoImpl的创建,但是此时BeanFactory类的Map容器还未填入任何对象,因此当业务层serviceImpl调用BeanFactory类get方法获取Map容器内的对象时,得到的持久层daoImplnull

调试后发现,在我的bean.properties文件中,键值对信息明明就是daoImpl在先,serviceImpl在后,但是读取到的顺序却是反的。
bean.properties

accountDao=com.zgkdbj.dao.impl.AccountDaoImpl
accountService=com.zgkdbj.service.impl.AccountServiceImpl

通过搜索,发现了读取 properties文件所用的Java自带类Properties读取到的键值对信息是无序的,故采用网友提供的MyProper类,该类继承Properties类,采用LinkedHashSet存储key,保证其顺序和配置文件一致,这样问题就解决了。代码如下:
MyProper.class

import java.util.*;

public class MyProper extends Properties {
    //LinkedHashSet有序,可以保证读取出来顺序不变
    private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
    /**
     * 读取key集合
     */
    @Override
    public Set<String> stringPropertyNames() {
        Set<String> set = new LinkedHashSet<String>();
        for (Object key : keys) {
            set.add((String) key);
        }
        return set;
    }

    @Override
    public Set<Object> keySet() {
        return keys;
    }

    /**
     * 枚举可以直接进行遍历,但是和iterator一样,遍历过程中不能进行修改删除等操作<br/>
     * 若要在遍历过程中进行修改擦除等操作,建议使用stringPropertyNames方法
     */
    @Override
    public synchronized Enumeration<Object> keys() {
        return Collections.enumeration(keys);
    }

    @Override
    public synchronized Object put(Object key, Object value) {
        keys.add(key);
        return super.put(key, value);
    }
    /**
     * 若要移除元素,要重写remove方法
     */
    @Override
    public Object remove(Object o) {
        keys.remove(o);
        return super.remove(o);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值