我有一个带依赖注入的工作项目和清晰Java EE中的Singleton:
@javax.inject.Singleton
public class SomeSingleton {...}
我在应用程序内的任何地方使用它,我收到相同的实例:
@Inject SomeSingleton instanceOfSingleton;
最近我不得不添加使用我的 SomeSingleton 类的Spring模块。 Spring需要通过@Bean注释手动生成实例:
@Bean
public SomeSingleton someSingleton(){
return new SomeSingleton();
}
问题是我现在有两个单身实例。我该如何解决这个问题?
答案 0 :(得分:0)
一方面,有一个单例从任何地方访问Spring的ApplicationContext,如下所述:http://sujitpal.blogspot.com.ar/2007/03/accessing-spring-beans-from-legacy-code.html
然后使用此代码段:
@javax.inject.Singleton
public class SomeSingleton {
@PostConstruct
void post() {
ApplicationContext ctx = SpringApplicationContext.get();
AutowireCapableBeanFactory awcbf = ctx.getAutowireCapableBeanFactory();
awcbf.configureBean(this, "someSingleton");
}
}
答案 1 :(得分:0)
好的,我找到了一个解决方案,但我不认为它很优雅,因为我必须替换所有的@Inject注释。这是:
在Spring配置文件(基于注释)中:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private void configureApplicationContext(ApplicationContext context) {
SpringApplicationContext.setApplicationContext(context);
}
@Bean
public SomeSingleton someSingleton() {
return new SomeSingleton();
}
//the rest of class code
}
我的类名为SpringApplicationContext(无需实现ApplicationContextAware):
public class SpringApplicationContext {
private static ApplicationContext CONTEXT;
public static void setApplicationContext(ApplicationContext context){
CONTEXT = context;
}
public static Object getBean(String beanName) {
return CONTEXT.getBean(beanName);
}
public static <T> T getBean(Class<T> type) {
return CONTEXT.getBean(type);
}
public static ApplicationContext get() {
if (CONTEXT == null) {
throw new RuntimeException();
}
return CONTEXT;
}
}
最后,当我想使用我的Singleton时,我使用它(而不是@Inject):
private SomeSingleton someSingleton = SpringApplicationContext.getBean(SomeSingleton.class);
我不知道我的解决方案是否还有其他缺点:(