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的风险