如何从不在 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
我不是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