如何将EJB与Spring Bean集成并处理Singleton

时间:2015-03-16 09:49:21

标签: spring-mvc java-ee dependency-injection singleton

我有一个带依赖注入的工作项目和清晰Java EE中的Singleton:

@javax.inject.Singleton
public class SomeSingleton {...}

我在应用程序内的任何地方使用它,我收到相同的实例:

@Inject SomeSingleton instanceOfSingleton;

最近我不得不添加使用我的 SomeSingleton 类的Spring模块。 Spring需要通过@Bean注释手动生成实例:

@Bean
public SomeSingleton someSingleton(){
    return new SomeSingleton();
}

问题是我现在有两个单身实例。我该如何解决这个问题?

2 个答案:

答案 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);

我不知道我的解决方案是否还有其他缺点:(