在下面的示例中,有没有办法避免执行context.getBean()?随后由testService使用的所有其他bean都将自动装配。 (这是一个控制台应用程序)
public class Test {
private static ITestService testService;
private static ApplicationContext context;
public static void main(String[] args) {
context = new ClassPathXmlApplicationContext(
new String[]{"/META-INF/spring/app-context.xml"});
ITestService testService = context.getBean(ITestService.class);
}
}
我尝试向ApplicationContext添加autowire注释,但它没有用。除了如果我自动装配它,它如何知道我的app-context.xml所在的位置?
更新:我找到了我需要的内容over here
答案 0 :(得分:3)
是的,你在这里错过了一些细节。
以下是Spring工作原理的简短说明。
1-以某种方式加载应用程序上下文(我们很快就会到达)。 2-加载后,应用程序上下文将初始化/创建定义的所有bean。这是bean作为依赖项注入的时候。在此之后无论何时从应用程序上下文中获取bean,该bean都已初始化并准备好与所有依赖项一起使用(考虑到一切正常)。
RE第一步,有几种方法可以自动化Spring初始化。 一种方法是你正在做的事情,明确地实例化一个。其他方式可以是context listener,以防您在网络环境中,或者使用@RunWith。 (您可以找到更多here)
在您的情况下,我相信您正在寻找在(单位?!?)测试环境中使用Spring,因此您正在寻找类似
的内容@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTest {
@Autowired
private ApplicationContext applicationContext;
// class body...
}
进一步详情here
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#testing
答案 1 :(得分:0)
如果不首先初始化应用程序上下文,则无法调用bean。
其次在你的情况下Test
类应该是bean本身由spring管理然后自动装配ITestService
。 Application上下文作为容器的目的是管理bean生命周期,因此您需要首先通过ClassPathXmlApplicationContext
初始化它,然后它将初始化您在ur xml文件中声明的所有bean。关于在使用servlet创建Web应用程序时避免使用getBean
方法,可以避免使用getBean。如果不是,你应该手动处理它。
答案 2 :(得分:0)
我同意@Desorder的说法。当我开始使用@RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration时,我曾经让我的测试用例工作。但我花了一些时间来了解这两者如何在内部工作以及它们的默认配置。
如果你想采取一些不同的方法并希望在没有@RunWith和@ContextConfiguration的情况下尝试,请查看链接 - TUTORIAL: JUNIT @RULE.这样,您将非常清楚哪个spring xml文件位置是提供。