Method injection更容易理解的翻译方式是通过方法注入。先不说什么是method injection,先通过一个问题(从官方文档翻译而来),引入method injection。
提出问题
一个单例bean A,如果依赖非单例的bean B(B被注入到A中);对于A来说,B就是一个单例的bean。因为不论使用构造器、setter或工厂方法注入,只会注入一次,现在想要的结果就是A对B的每次使用,都希望新实例化一个B。
解决方式一:放弃一部分IoC,与Spring耦合(不推荐使用)
就拿上面的问题来说,如果A依赖于Spring容器(A保存一个容器的引用),A每次使用B时,都通过容器的getBean("B")来获取一个新的实例。
public class CommandManager {
private ApplicationContext applicationContext;
public Object process(Map commandState) {
// grab a new instance of the appropriate Command
Command command = createCommand();
// set the state on the (hopefully brand new) Command instance
command.setState(commandState);
return command.execute();
}
protected Command createCommand() {
// notice the Spring API dependency!
return this.applicationContext.getBean("command", Command.class);
}
}
看这个例子,每次CommandManager调用process的时候,都会调用creatCommand,也就是说从容器中取一个非单例的bean。