Spring Boot I上的大多数示例都集中在构建简单的Web应用程序上。也就是说,您完全可以完全控制所有内容的Web应用程序。
另一方面,我找不到如何构建非Web应用程序的示例,其中应用程序的较大部分依赖于第三方代码。
考虑下面的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()
。
现在,第三方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
:
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
。这是第三方课程,我无法控制它,我无法修改它。因此,我无法添加任何注释。
我可以轻松地使用XML配置,但考虑到注释似乎是最佳实践"这些天我这样做的方式我想知道如何使用注释来实现这一点。
如果这样做的注释方式涉及大量代码,那么我想知道这与我认为很容易理解的XML配置相比有什么优势;以及一种易于跨越不同项目的模式。
答案 0 :(得分:12)
您需要定义一个@Configuration
类,将SomeFactory
构建为Bean:
@Configuration
class SomeFactoryConfiguration {
@Bean
public ServiceFactory serviceFactory() {
return new ServiceFactory(/* create/get ServiceA and ServiceB somehow */):
}
}
这将在Spring应用程序中将此ServiceFactory实例公开为Bean,您只需自动装配即可。
如果您愿意,您也可以创建ServiceA和ServiceB作为Beans,然后在创建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();
}
}