Spring的方法注入

时间:2015-04-20 10:42:33

标签: java spring

我正在阅读Spring当前版本的文档,并且对理解章节5.4.6 Method Injection有疑问。据我所知,每次使用bean调用方法时,我们都可以提供重新创建bean的能力。文档提供以下代码示例:

public class CommandManager implements ApplicationContextAware {

    //Imports and comments were omitted
    private ApplicationContext applicationContext;

    public Object process(Map commandState) {
        Command command = createCommand();
        command.setState(commandState);
        return command.execute();
    }

    protected Command createCommand() {
        return this.applicationContext.getBean("command", Command.class);
    }

    public void setApplicationContext(
            ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

ApplicationContextAware界面如下所示:

public interface ApplicationContextAware {

    //JavaDocs ommited
    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

}

那么,方法public Object process(Map commandState)是什么?这是回调吗?如果是这样,它将在何处被调用以及谁执行该调用?毕竟,不清楚为什么每次需要时都要重新创建bean。

2 个答案:

答案 0 :(得分:2)

CommandCommandManager类只是示例类,其中process()是该示例的一部分。它们与ApplicationContextAware无关。

请注意CommandManager的示例中的注释:

// a class that uses a stateful Command-style class to perform some processing

process()将由应用程序在其他地方调用;这个例子并不重要。如果您未在代码中使用完全相同的模型,则应忽略此方法,并在适用的情况下调用applicationContext.getBean()

最后,是的CommandManager应该注册为bean,以便春天可以调用setApplicationContext()

修改

  

为什么spring知道必须每次都使用name命令重新创建bean

鉴于示例的内容,它没有。示例代码调用getBean(),根据the javadocs

  

返回指定bean的实例,该实例可以是共享的或独立的。

为了确保您始终获得新实例,您需要使用prototype范围。

<bean id="beanB class="Command" scope="prototype"/>

答案 1 :(得分:1)

注射实际上发生在这里:

protected Command createCommand() {
    // notice the Spring API dependency!
    return this.applicationContext.getBean("command", Command.class);
}

我们只是在这种方法中获得具有不同生命周期的bean。