是否可以将 Spring 管理的 Bean 连接到一个不是由春季国际奥委会管理?假设有两个类ClassA
(不由 spring 管理(和 ClassB
(由Spring管理(是否可以在ClassA
中ClassB
接线。
这是我最近遇到的一个问题,我不知道该怎么做?
是的,这是可能的。您需要一个ApplicationContextAware
实现才能使用 ApplicationContext
获取 Spring 托管 Bean 实例。这是一个古老的 Spring 框架技巧。
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public final class BeanUtil implements ApplicationContextAware {
private static ApplicationContext CONTEXT;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
CONTEXT = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return CONTEXT.getBean(beanClass);
}
}
然后BeanUtil::getBean
必须在 ClassA 中使用静态方法来获取 ApplicationContext
中的 ClassB 实例。
public class ClassA {
private ClassB classB;
@Override
public String toString() {
return "ClassA - " + getClassB().toString();
}
// Lazy initialization of ClassB to avoid NullPointerException
private ClassB getClassB() {
if (classB == null) {
classB = BeanUtil.getBean(ClassB.class);
}
return classB;
}
}
如果 Spring 没有管理豆子,请忘记"布线"。相反只需解决"如何将对托管 Bean 的引用获取到非托管 Bean"的问题。
在您的示例中,由于ClassA
不是由 Spring 管理的,因此您必须在某个地方创建它。在创建 ClassA
的实例时传递对ClassB
的引用ClassA
。