Java 如何从不在Spring容器中的类访问方法Springbean

Java 如何从不在Spring容器中的类访问方法Springbean,java,spring,spring-mvc,Java,Spring,Spring Mvc,我不是职业选手,所以请容忍我 我有三门课: class SpringBeanA { public aMethod() { ..... } } class SpringBeanB { @Autowired SpringBeanA a; public bMethod() { a.method(); } } class NONSpringClass { ..... b.method(); .....

我不是职业选手,所以请容忍我

我有三门课:

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
类中启用
SpringBeanB
注入,或者您必须在
NONSpringClass
引用中手动注入
SpringBeanB
的适当实例。在后一种方法中,Spring无事可做,您必须手动创建必要的实例并使用setter注入它们。

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


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

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

首先创建一个spring配置类,将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;
  }

}
现在你可以在你的非春季课程中尝试这个

((SpringBeanB)StaticApplicationContext.getContext.getBean("b")).bMethod();
请记住,在spring上下文初始化之前调用getContext方法可能会导致NullPointerException。另外,在spring容器之外访问bean也不是推荐的方法。理想的方法是将所有bean移动到spring容器中进行管理


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

演示如何将SpringBeanB自动连接到NONSpringClass。我刚刚更新了我的问题,介绍了我是如何自动连接@Sotirios Delimanolis的。感谢您的回复。让我们看看您是如何使用
NONSpringClass
。我想他是在寻找访问bean的实际机制。@DavisYoshida这是不可能的,除非使用Spring,这属于前一个解决方案建议。但OP可能不会/不能这样做。通常,构造函数注入用于强制依赖项,而setter用于可选依赖项。您完全可以取出ApplicationContext并作为静态方法公开。这不是首选方法,但会起作用。您不能将
ApplicationContext
注入非Springbean中。ApplicationContext是一个接口,而不是classI。我意识到它是一个接口。我应该更清楚地指出,应该使用实现ApplicationContext接口的某个类@Luiggi Mendoza,关于如何从非spring bean访问应用程序上下文,请参见上面kamoor的答案。除非
NONSpringClass
成为spring bean,否则这将不起作用。@Luiggi Mendoza see StaticApplicationContext是一个spring bean(@Configuration),并以静态方式公开getContext。我在警告中提到了NPE的风险