我发现有关Spring Boot的大多数示例都集中在构建简单的Web应用程序上。也就是说,您可以完全控制Web应用程序。
另一方面,我在寻找如何构建非Web应用程序的示例方面运气不佳,该应用程序的大部分依赖于第三方代码。
考虑下面的我的com.mypackage.Application课。
com.mypackage.Application
package com.mypackage; import com.3rdparty.factory.ServiceFactory; public class Application { private final ServiceFactory sf; public Application(ServiceFactory sf) { this.sf = sf; } public void doSomeWork() { ServiceA sa = sf.getServiceA(); [...] }
本Application类只实例化DefaultManager,并调用run()。
Application
DefaultManager
run()
现在,第3方ServiceFactory类具有其他依赖项:
ServiceFactory
package com.3rdparty.factory; import com.3rdparty.service.ServiceA; import com.3rdparty.service.ServiceA; public class ServiceFactory { private final ServiceA sa; private final ServiceB sb; public ServiceFactory(ServiceA sa, ServiceB sb) { this.sa = sa; this.sb = sb; } public ServiceA getServiceA() { return sa; } public ServiceB getServiceB() { return sb; } }
我可以Application从Main课程开始:
Main
import com.mypackage.Application; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("path/to/applicationContext.xml"); Application app = (Application) context.getBean("app"); app.doSomeWork(); }
问题 :我如何注入ServiceA和ServiceB注入ServiceFactory。这是第三方课程,我无法控制,也无法修改。因此,我无法添加任何注释。
ServiceA
ServiceB
我可以很容易地将其与XML配置一起使用,但是考虑到注释似乎是当今的“最佳实践”方式,所以我想知道如何使它与注释一起使用。
如果这样做的注释方式涉及大量代码,那么我想知道与XML配置相比,这给我带来了什么好处,我认为这很容易理解;以及易于在不同项目中使用的模式。
您需要定义一个将Bean @Configuration构建SomeFactory为Bean的类:
@Configuration
SomeFactory
@Configuration class SomeFactoryConfiguration { @Bean public ServiceFactory serviceFactory() { return new ServiceFactory(/* create/get ServiceA and ServiceB somehow */): } }
这将在您的Spring应用程序中将此ServiceFactory实例公开为Bean,您可以简单地自动装配。
如果愿意,也可以将ServiceA和ServiceB创建为Bean,然后在创建ServiceFactory时引用它们:
@Configuration class SomeFactoryConfiguration { @Bean public ServiceFactory serviceFactory() { return new ServiceFactory(serviceA(), serviceB()): } @Bean public ServiceA serviceA() { return new ServiceA(); } @Bean public ServiceB serviceB() { return new ServiceB(); } }