如何从不在 Spring 容器中的 class 访问方法 Spring Bean

How to access a method a Spring Bean from a class not in the Spring Container

我不是Spring专业人士,所以请多多包涵....

我有三个类:

class SpringBeanA {
    public aMethod() {
        .....
    }
}

class SpringBeanB {

    @Autowired SpringBeanA a;

    public bMethod() {
        a.method();
    }
}

class NONSpringClass {
    .....
    b.method();
    .....
}

b.method() 在通过实例 SpringBeanB b = new SpringBeanB() 访问和将 SpringBeanB 自动装配到 NONSpringClass 时都会出现空指针错误。

自动装配:

class NONSpringClass {

    @Autowired SpringBeanB b;

    .....
    b.method();
    .....
}

如何才能成功调用b.method()

您可以让 Spring 管理您的 NONSpringClass 并在 NONSpringClass class 中启用 SpringBeanB 注入,或者您必须手动注入适当的实例SpringBeanB 在您的 NONSpringClass 参考中。在后一种方法中,Spring 无事可做,您必须手动创建必要的实例并使用 setter 注入它们。

一个简单的方法是使用 ApplicationContext.getBean()。

值得指出的是,这被认为是不好的做法,因为它破坏了控制反转。

Spring 初始化所有对象并将其保存在 Spring 应用程序上下文中。您有几种不同的方法来访问应用程序上下文中的对象

首先创建一个 spring 配置 class 以将 ApplicationContext 注入私有属性并公开为静态方法。

@Configuration
class StaticApplicationContext implements ApplicationContextAware{

  static ApplicationContext applicationContext = null;

  public void setApplicationContext(ApplicationContext context)    throws BeansException {
    applicationContext = context;
  }
  /**
   * Note that this is a static method which expose ApplicationContext
   **/
  public static ApplicationContext getContext(){
        return applicationContext;
  }

}

现在您可以在非 spring class,

中尝试此操作
((SpringBeanB)StaticApplicationContext.getContext.getBean("b")).bMethod();

请记住,在 spring 上下文初始化之前调用 getContext 方法可能会导致 NullPointerException。此外,不推荐在 spring 容器之外访问 bean。理想的方法是将所有 beans 移动到 spring 容器中进行管理。

如果您想从 java Servelet 访问 SpringApplicationContext,请参考 WebApplicationContextUtils