【问题标题】:Lightweight class-loader for custom class initialization?用于自定义类初始化的轻量级类加载器?
【发布时间】:2011-01-21 04:12:45
【问题描述】:

我想将一些数据注入静态类字段,这些字段是从大量 XML 文件生成的。

class Foo {
    ...
    static MetaData xxx; 
    static MetaData yyy; 
}

注入很简单,找到Foo.properties,解析xxx,yyy属性,然后构造MetaData实例。

我不确定 IoC 容器是否有助于这项任务,但似乎没有。

因为,Foo 可能被 IoC 容器未加载的类使用。

我的想法是,修改上下文类加载器,添加一些基于反射的特定类初始化代码。

有什么想法吗?

编辑 有很多 IoC 容器,我猜其中一些可能支持初始化扩展。

【问题讨论】:

  • Because, the Foo maybe used by classes which are not loaded by IoC container. 这可能没问题,但 IoC 通常需要一些配置/注释,这可能是。你不能不修改ClassLoader,只需找到所有类或属性文件,调用Class.forName并进行一些反思吗?实际上,如果可能的话,我宁愿通过创建 Map> 来避免这一切。
  • 不,去掉 Class.forName() 是设计目的。不会有Map,解析/构造过程非常快,而且里面的MetaData是弱引用,减少内存占用。
  • 为什么懒惰模式下不能初始化xxx、yyy?

标签: java ioc-container classloader


【解决方案1】:

xxx, yyy 在懒惰模式中初始化。

如:

private static MetaData xxx=null;
public static MetaData getXXX(){
    if(xxx=null){
       xxx=parse("Foo.properties");
    }
    return xxx;
}

如果您的程序必须使用 Ioc,那么 Spring 中的 BeanPostProcessors 可以是一个选择。您可以在 BeanPostProcessor 中解析文件并创建 MetaData 对象。

【讨论】:

  • 一个类中从模型中生成了几十个MetaData,显式构造它们会污染源代码。
  • P.S.延迟初始化应该是同步的。见bit.ly/gJdSK2。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多