Spring—如何使用Spring依赖项注入来编写独立的Java应用程序

Spring—如何使用Spring依赖项注入来编写独立的Java应用程序,java,dependency-injection,inversion-of-control,spring,Java,Dependency Injection,Inversion Of Control,Spring,我想用IOC编写一个独立的应用程序,如何在其中使用springs依赖项注入?我在用JIdea。有Spring2.5支持,但我想使用Spring3.0,这是我尝试的方式 我有使用SpringMVC的经验,我们可以在WebApplicationContext中注入依赖项,但如何在独立应用程序中注入依赖项呢 我试过这个 ApplicationContext context=new ClassPathXmlApplicationContext(新字符串[]{“com\\ttg\\xmlfile.xml”

我想用IOC编写一个独立的应用程序,如何在其中使用springs依赖项注入?我在用JIdea。有Spring2.5支持,但我想使用Spring3.0,这是我尝试的方式

我有使用SpringMVC的经验,我们可以在WebApplicationContext中注入依赖项,但如何在独立应用程序中注入依赖项呢

我试过这个

ApplicationContext context=new ClassPathXmlApplicationContext(新字符串[]{“com\\ttg\\xmlfile.xml”})

但是我看不到依赖项是由那里定义的bean(在XML文件中)注入的 我将上面的代码放在main方法中,并为两个对象定义了两个bean,在一个Java类的构造函数中,我使用了另一个类的对象——它被注入到这个对象中——并在这个对象上调用了一个方法,这个方法将打印一些东西,但它不起作用。我认为上面的代码创建了所有依赖项并注入了它们,但看起来不是这样

如何在不包含WebApplicationContext的独立应用程序中正确使用Springs IOC和依赖项注入


请说明步骤。

您是在调用
context.getBean(“beanName”)
以获取对该bean的引用,还是在执行
新建SomeClass()
?如果通过
getBean()
执行,则应设置注入的属性


另外,确保使用相同的bean工厂(ClassPathXmlApplicationContext实例)检索所有bean。这很可能是静态最终版本,并由整个应用程序使用。

您如何确认您的bean没有正确连接?一个常见的问题是xml配置文件位置不正确。你能给我们一些更多的信息,比如你的项目布局和你用来从容器中获取bean的代码吗?

假设你有:

class Bean1 {
  Bean2 bean2;
}

class Bean2 {
  String data;
}
context.xml文件

<bean id="bean1" class="Bean1">
  <property name="bean2" ref="bean2" />
</bean>

<bean id="bean2" class="Bean2" />

如果你将log4j日志添加到你的应用程序中,你应该会看到一系列的消息,这些消息会告诉你很多关于Spring正在做什么和没有做什么。如果你没有这样的反馈,那你就不知所措了。您可能只需要从log4j中获取更多Spring信息就可以找到答案。

您可以使用Spring提供的自动连接支持,以便将依赖项(并可能应用后处理器)注入到不属于应用程序上下文的对象

在您的情况下,此对象是您的独立应用程序

以下是实现这一目标的方法。在本例中,我使用@Autowired(对于b1)、传统DI(对于b2)和初始化钩子(对于b3)。带注释的自动连接支持假定您已在应用程序上下文中定义了适当的spring后处理器(例如,通过声明

在本例中,所有b1、b2和b3都应为非null(假设应用程序上下文中存在b1和b2 bean)


我还没有测试过它(可能因为一些打字错误而无法编译),但这个想法在最后3行中。请参阅javadocs以了解Autowired CapableBeanFactory
和所提到的方法,以准确了解发生的情况。

您可以使用命令@Autowired

如果您喜欢(大部分)纯java,您可以使用java配置:

@Configuration
pubic class MyConfig {

   @Bean
   public Bean1 bean1() { return new Bean1(); }

   @Bean
   public Bean2 bean2() { return new Bean2(bean1()); }
}
然后举例说明:

ApplicationContext ctx = 
    new AnnotationConfigApplicationContext(MyConfig.class);
请记住,纯注释驱动配置尚不支持某些功能(例如tx:annotation-driven),您可能需要一些xml粘合代码来实现这些功能

<beans>
  <tx:annotation-driven />
  <context:annotation-config/>
  <bean class="MyConfig"/>
</beans>


然后使用基于xml的标准方法创建应用程序上下文(如ClasspathXmlApplicationContext或SpringWeb上下文加载器等)。

后来我发现我没有添加一个库,这就是原因——antlr-3.0.1.jar---
ApplicationContext ctx = 
    new AnnotationConfigApplicationContext(MyConfig.class);
<beans>
  <tx:annotation-driven />
  <context:annotation-config/>
  <bean class="MyConfig"/>
</beans>