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

Pro*_*Rev 7 java spring spring-mvc

我不是春天职业选手,所以请耐心等待....

我有三个班:

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

class SpringBeanB {

    @Autowired SpringBeanA a;

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

class NONSpringClass {
    .....
    b.method();
    .....
}
Run Code Online (Sandbox Code Playgroud)

b.method()在通过实例进行接口SpringBeanB b = new SpringBeanB()并将SpringBeanB自动装配到NONSpringClass 时,会发出空指针错误.

自动装配:

class NONSpringClass {

    @Autowired SpringBeanB b;

    .....
    b.method();
    .....
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能成功打电话b.method()

kam*_*oor 11

Spring初始化所有对象并将其保存在Spring Application Context中.您可以通过几种不同的方式访问Application上下文中的对象

首先创建一个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;
  }

}
Run Code Online (Sandbox Code Playgroud)

现在你可以在你的非春季班试试这个,

((SpringBeanB)StaticApplicationContext.getContext.getBean("b")).bMethod();
Run Code Online (Sandbox Code Playgroud)

请记住,在spring上下文初始化之前调用getContext方法可能会导致NullPointerException.也不建议在弹簧容器外部访问bean.理想的方法是将所有豆子移入弹簧容器进行管理.

如果要从java Servelet访问SpringApplicationContext,请参阅WebApplicationContextUtils