我正在阅读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。
答案 0 :(得分:2)
Command
和CommandManager
类只是示例类,其中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。