如何从不是由spring创建的对象访问spring bean

Dev*_*ked 12 java spring hibernate

在我的Web应用程序中,我使用hibernate和spring.在某些情况下,从Hibernate层返回的实体类需要访问其他服务类.实体类不只是DTO,它们包含一些业务逻辑,并且为了执行某些业务逻辑(例如,当满足某些条件时可能发送电子邮件等),这些需要访问服务类.服务类是spring bean.那么在这种场景中推荐的方法是什么,以便在Spring环境之外创建的这些实体类中获取spring bean?

Jig*_*shi 15

您正在寻找服务定位器模式,

在Spring中实现

您可以注册ApplicationContextAware并获取对ApplicationContextbean的静态服务

public class ApplicationContextUtils implements ApplicationContextAware {
 private static ApplicationContext ctx;

 private static final String USER_SERVICE = "userServiceBean";

  @Override
  public void setApplicationContext(ApplicationContext appContext)
      throws BeansException {
    ctx = appContext;

  }

  public static ApplicationContext getApplicationContext() {
    return ctx;
  }

  public static UserService getUserService(){return ctx.getBean(USER_SERVICE);}

}
Run Code Online (Sandbox Code Playgroud)

  • 但是这种实现可能会在Sonar(代码转换工具)中产生重大错误,因为我们从非静态方法设置静态字段.因此,为了避免这种情况,您可能必须创建单独的AppContext类,其中您通过静态getApplicationContext()方法初始化应用程序上下文,并使用静态setApplicationContext()设置上下文.从实现ApplicationContextAware的类调用此AppContext的set方法,如下所示:@Override public void setApplicationContext(ApplicationContext applicationContext){AppContext.setApplicationContext(applicationContext); }` (4认同)

Jos*_*tin 5

阅读关于@Configurable允许使用 AspectJ 配置 bean 的注释:

如果你不想使用 AspectJ,你可以使用

ApplicationContext.getAutowireCapableBeanFactory().autowireBean()

配置驻留在 spring 容器之外的 bean 的方法。(请参阅 Java 文档)。