我需要从单例中获取原型类。我发现方法注入是可行的方法,但是我真的不知道如何使用spring @Lookup注释。
我是依赖注入的新手,我选择了注释配置,因此我想朝着这个方向继续。
我发现@Lookup注释是最近才添加的(https://spring.io/blog/2014/09/04/spring- framework-4-1-ga-is-here),但是我找不到任何方法用它。
所以,这是简化的例子
配置类:
@Configuration @Lazy public class ApplicationConfiguration implements ApplicationConfigurationInterface { @Bean public MyClass1 myClass1() { return new ContentHolderTabPaneController(); } @Bean @Scope("prototype") public MyClass2 myClass2() { return new SidebarQuickMenuController(); } }
这是课程示例:
public class MyClass1 { doSomething() { myClass2(); } //I want this method to return MyClass2 prototype public MyClass2 myClass2(){ } }
我该如何使用@Lookup注释?
在@Lookup对public MyClass2 myClass2()方法应用注释之前,请在@Lookup的Javadoc中阅读以下内容:
@Lookup
public MyClass2 myClass2()
容器将通过CGLIB生成方法的包含类的运行时子类,这就是为什么这种查找方法只能在容器通过常规构造函数实例化的bean上起作用的原因(即, 查找方法无法替换为从工厂方法返回的bean ,而我们无法这样做)动态为其提供子类)。
因此,从以下代码中删除以下工厂方法样式Bean声明ApplicationConfiguration:
ApplicationConfiguration
@Bean public MyClass1 myClass1() { return new ContentHolderTabPaneController(); }
并添加@Component注释以让Spring实例化bean(还将@Lookup注释添加到方法中):
@Component
@Component public 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。
myClass1
myClass2
更新 :
实现带@Lookup注释的方法(“查找方法”)并不难。在没有@Lookup并使配置类保持不变的情况下,现在MyClass1看起来像(实际上,如果@Lookup使用过,Spring在子类中会生成类似的实现):
MyClass1
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为您注入。
ApplicationContext