在独立应用程序中使用Spring
使用Spring框架的独立应用程序
如果你在每个地方都调用context.getBean(),那么你可能没有理解Spring的整个意义,Spring是一个依赖注入框架。
在一个独立的应用程序中,你通常只调用一次(或者至少非常少)context.getBean(),以获取一个"根"bean。这个bean由Spring注入其他的bean,依此类推。
在Web应用程序中,一切都取决于你使用的框架。但通常情况下,你在web.xml中注册一个监听器来为你加载上下文,控制器由Spring创建和/或注入。
哦,所以你只是用它来启动应用程序。
好的,谢谢。你能解释一下你所说的我错过了DI框架的重点吗?这样我就可以去读一下。还有为什么你只能调用一次?
DI实现了好莱坞原则:"不要打电话给我,我会给你打电话"。目标是避免查找你的依赖项,而是由Spring注入它们。这就是为什么单元测试变得如此简单。如果你在上下文中查找所有的依赖项,那么你就不再使用DI了。你在main方法中只调用一次,因为这是绝对的最小值。在其他地方,你使用DI。
问题的出现原因:
在独立应用程序中使用Spring时,其中一个类(通常是主类)必须是Spring感知的,以创建上下文。所有其他类可以继续通过Spring进行连线,不需要是上下文感知的。
解决方法:
1. 在主类中,使用Spring的注解或配置文件来标识该类是Spring感知的,可以通过以下方式之一来创建Spring上下文:
- 使用注解:在主类上添加`@SpringBootApplication`注解,或使用`@Configuration`和`@ComponentScan`注解。
- 使用配置文件:在主类中使用`@ImportResource`注解,指定Spring的配置文件路径。
2. 对于其他类,可以继续使用Spring进行连线,无需进行上下文感知的操作。可以使用以下方式之一来实现:
- 使用注解:在其他类中使用`@Autowired`注解,将依赖注入到类中。
- 使用XML配置文件:在Spring的配置文件中,使用`
通过以上方法,可以在独立应用程序中使用Spring来管理和连接各个类,实现依赖注入和解耦的效果。
在独立应用程序中使用Spring的问题是如何初始化应用程序上下文并使用它来创建应用程序的入口点。上面的代码展示了一种解决方法,它使用ClassPathXmlApplicationContext来初始化应用程序上下文,并使用BeanFactoryUtils.beanOfType方法获取已经被Spring自动装配好的MyApplication bean,并调用其init方法。
还有一种更简洁的方式是将app.init配置为MyApplication的init-method,这样就不需要显式地获取bean和调用方法了,一切都由Spring处理。
不过有人认为显式调用方法更清晰,而且在这种简单的示例中,使用Lifecycle接口可能有点过头了。Lifecycle接口提供了start()、stop()和isRunning()方法,当在应用程序上下文上调用这些方法时,所有实现了Lifecycle接口的bean都会相应地调用相应方法。
,使用Spring在独立应用程序中的问题可以通过初始化应用程序上下文并获取已经被Spring装配好的bean来解决。这可以通过显式调用方法或配置init-method来实现。