在
@Lookup对
public MyClass2 myClass2()方法应用注释之前,请在@Lookup的Javadoc中阅读以下内容:
容器将通过CGLIB生成该方法的包含类的运行时子类,这就是为什么这种查找方法只能在容器通过常规构造函数实例化的bean上起作用的原因(即,查找方法无法替换从工厂方法返回的bean,而我们无法这样做)动态为其提供子类)。
因此,从以下代码中删除以下工厂方法样式Bean声明
ApplicationConfiguration:
@Bean public MyClass1 myClass1() { return new ContentHolderTabPaneController(); }并添加
@Component注释,以使Spring实例化bean(还将
@Lookup注释添加到方法中):
@Componentpublic class MyClass1 { doSomething() { myClass2(); } //I want this method to return MyClass2 prototype @Lookup public MyClass2 myClass2(){ return null; // This implementation will be overridden by dynamically generated subclass }}现在,使myClass1bean脱离上下文,并且它的myClass2方法应该每次都被替换/重写以获取新的原型bean。
更新:
Using factory method declaration
实现带
@Lookup注释的方法(“查找方法”)并不难。在没有
@Lookup使你的配置类保持不变的情况下,现在MyClass1看起来像(实际上,如果
@Lookup使用了Spring,则会在子类中生成类似的实现):
public class MyClass1 { doSomething() { myClass2(); } //I want this method to return MyClass2 prototype @Autowired private ApplicationContext applicationContext; public MyClass2 myClass2() { return applicationContext.getBean(MyClass2.class); }}Spring
ApplicationContext为你注入。



