弹簧自动装配不能从非弹簧管理类工作

l a*_*a s 21 spring tomcat spring-mvc

我有一个类(ABC类),通过调用构造函数实例化.ABC类依次使用自动连线注入辅助类(Class XYZ).

我们是一个基于Spring MVC的应用程序,在服务器启动时我没有看到任何异常.

但我仍然认为Class XYZ为null.是因为类ABC不是由Spring容器实例化的吗?

在这种情况下,我如何使用自动布线?

谢谢.

Ash*_*sia 27

您可以使用这种方式在非spring bean类中使用spring bean

    public class ApplicationContextUtils implements ApplicationContextAware {

  private static ApplicationContext ctx;

  @Override
  public void setApplicationContext(ApplicationContext appContext)
      throws BeansException {
    ctx = appContext;

  }

  public static ApplicationContext getApplicationContext() {
    return ctx;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过getApplicationContext()这个方法获取applicationcontext对象.

从applicationcontext你可以得到这样的spring bean对象:

 ApplicationContext appCtx = ApplicationContextUtils
    .getApplicationContext();
String strFromContext = (String) appCtx.getBean(beanName);
Run Code Online (Sandbox Code Playgroud)

  • 在我的例子中,我需要在`ApplicationContextUtils`上添加`@Component`,或者只在`ApplicationContextUtils .getApplicationContext();中获取null. (8认同)

lre*_*der 7

自动装配不起作用,因为ABC不管理类.您可以通过在类定义上方使用@Component注释之一(@ Component,@ Service,@ Controller等),然后在应用程序上下文XML中使用context:component-scan,或者去旧学校和只需在应用程序上下文中直接定义bean.

如果由于某种原因你不能使Spring管理类ABC,你可以使用类似的东西在ABC中加载应用程序上下文:

ApplicationContext context = new ClassPathXmlApplicationContext("path/to/applicationContext.xml");

然后使用:

XYZ someXyz =(XYZ)context.getBean("MyXYZ");

手动设置bean值.


chr*_*ke- 5

正确:你不能只调用new一个类并把它全部连接起来;你必须这样做。Spring 必须管理 bean 才能发挥其所有魔力。

如果您可以发布有关您的用例的更多详细信息,我们也许可以建议有用的选项。