Lookup Method Injection 在Spring v1.1版本时加入,用来解决当一个bean依赖于一个与其生命周期不同的bean时出现的问题。尤其,当一个singleton依赖一个nonsingleton时。在这种情况下,setter和constructor注入都会导致一个singleton bean维护一个原本为nonsingleton的单例。在有些情况下,你希望singleton bean 每次都获取一个新的nonsingleton实例。
设想一个场景,LockOpener类提供开锁服务,它依赖于KeyHelper类来打开锁。但是,KeyHelper的设计涉及到一些内部状态,不适合复用。每次调用openLock()方法时,需要生成一个新的KeyHelper。在这种情况下,LockOpener是singleton,但是如果我们使用常用的方法注入KeyHelper,每次获取的都是同样的KeyHelper实例(在Spring首次注入时实例化的KeyHelper)。为了保证每次获取新的KeyHelper实例,我们需要使用Lookup Method Injection。
通常,你可以通过让singleton bean实现ApplicationContextAware接口来实现,然后,使用ApplicationContext实例,singleton bean会每次都获取一个新的实例。Lookup Method Injection让singleton bean声明它需要一个nonsingleton dependency,不需要实现特定的Spring接口,就可以在需要时获取一个新的实例。
Lookup Method Injection通过声明一个方法,lookup method,它会返回一个nonsingleton bean的一个实例。