有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring BeanFactory作为Swing应用程序中的单例

我目前正在重构一个大型的Swing应用程序,以便从XmlBeanFactory获取一些对象

很多不同的班级都可以使用它,我想知道分享这个豆工厂的最佳方式是什么

  • 我应该创建一个Singleton来共享这个XmlBeanFactory吗

    单身阶级 { 公共静态XmlBeanFactory getBeanFactory() { (...) } }

  • 或者我应该给我的对象添加一些setter(丑陋:它添加了一些依赖项…)

  • 另一个解决方案

谢谢


共 (1) 个答案

  1. # 1 楼答案

    使用静态单例是一个不错的选择。我还没有找到更好的解决办法。这有点不令人满意,因为在使用单例之前,必须使用一个连接文件对其进行初始化,否则会导致bean创建异常,这只是需要记住的另一件事

    public final class SpringUtil {
    
    private static ApplicationContext context = null;
    private static Set<String> alreadyLoaded = new HashSet<String>();
    
    /**
     * Sets the spring context based off multiple wiring files. The files must exist on the classpath to be found.
     * Consider using "import resource="wiring.xml" in a single wiring file to reference other wiring files instead.
     * Note that this will destroy all previous existing wiring contexts.
     * 
     * @param wiringFiles an array of spring wiring files
     */
    public static void setContext(String... wiringFiles) {
        alreadyLoaded.clear();
        alreadyLoaded.addAll(Arrays.asList(wiringFiles));
        context = new ClassPathXmlApplicationContext(wiringFiles);
    }
    
    /**
     * Adds more beans to the spring context givin an array of wiring files. The files must exist on the classpath to be
     * found.
     * 
     * @param addFiles an array of spring wiring files
     */
    public static void addContext(String... addFiles) {
        if (context == null) {
            setContext(addFiles);
            return;
        }
    
        Set<String> notAlreadyLoaded = new HashSet<String>();
        for (String target : addFiles) {
            if (!alreadyLoaded.contains(target)) {
                notAlreadyLoaded.add(target);
            }
        }
    
        if (notAlreadyLoaded.size() > 0) {
            alreadyLoaded.addAll(notAlreadyLoaded);
            context = new ClassPathXmlApplicationContext(notAlreadyLoaded.toArray(new String[] {}), context);
        }
    }
    
    /**
     * Gets the current spring context for direct access.
     * 
     * @return the current spring context
     */
    public static ApplicationContext getContext() {
        return context;
    }
    
    /**
     * Gets a bean from the current spring context.
     * 
     * @param beanName the name of the bean to be returned
     * @return the bean, or throws a RuntimeException if not found.
     */
    public static Object getBean(final String beanName) {
        if (context == null) {
            throw new RuntimeException("Context has not been loaded.");
        }
        return getContext().getBean(beanName);
    }
    
    /**
     * Sets this singleton back to an uninitialized state, meaning it does not have any spring context and
     * {@link #getContext()} will return null. Note: this is for unit testing only and may be removed at any time.
     */
    public static void reset() {
        alreadyLoaded.clear();
        context = null;
    }
    

    }

    在springframework的较新版本中,您可以使用泛型使getBean()返回比Object更具体的类,这样您就不必在获取bean后强制转换它