Spring在新java对象中自动连接

Spring在新java对象中自动连接,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我开始使用SpringBoot,遇到了一个关于如何在Spring应用程序上下文不管理的java对象中自动连接SpringBean的问题 场景:在我的Spring Boot应用程序中,我想编写一个计划任务,该任务首先从数据库中获取“environment”类型的主数据列表。对于每个“环境”对象,将执行多个异步Rest调用,这些调用返回一些JSON数据(这里是“applicationServerData”)。这些数据应该保存在本地,直到所有rest呼叫响应到达。经过一些处理后,结果将写入数据库 因此

我开始使用SpringBoot,遇到了一个关于如何在Spring应用程序上下文不管理的java对象中自动连接SpringBean的问题

场景:在我的Spring Boot应用程序中,我想编写一个计划任务,该任务首先从数据库中获取“environment”类型的主数据列表。对于每个“环境”对象,将执行多个异步Rest调用,这些调用返回一些JSON数据(这里是“applicationServerData”)。这些数据应该保存在本地,直到所有rest呼叫响应到达。经过一些处理后,结果将写入数据库

因此,我考虑创建某种处理器类,能够在本地保存请求的数据。对于每个环境,将使用新操作符创建一个新对象:

@Slf4j
public class EnvironmentProcessingServiceImpl implements
    EnvironmentProcessingService {

@Autowired
private DataManagementFacade dataManagementFacade;

@Autowired
@Qualifier(value = "mock")
private ProductionDataClient productionDataClient;

private Environment environment;

private List<ApplicationServerDataHolder> applicationServerDataHolderList;

public EnvironmentProcessingServiceImpl(Environment environment) {
    this.environment = environment;
    this.applicationServerDataHolderList = new ArrayList<>();
}
@Slf4j
公共类环境ProcessingServiceImpl实现
环境处理服务{
@自动连线
私有DataManagementFacade DataManagementFacade;
@自动连线
@限定符(value=“mock”)
私有产品数据客户端产品数据客户端;
私人环境;
私有列表应用程序ServerDataHolderList;
公共环境ProcessingServiceImpl(环境){
这个。环境=环境;
this.applicationServerDataHolderList=新的ArrayList();
}
现在的问题是,
@Autowired
无法工作,因为对象不是由Spring管理的,但我不能简单地将其作为一个
@service
,因为如果我想在同一个类中保存数据,我需要多个实例。我读到了一个带有
@Configurable
注释的解决方案。这是一个好做法吗

或者我应该创建class a
@service
,并创建另一个组件来缓存所有数据,并在任务完成后擦除,以便为下次运行创建空列表


在这种情况下,您认为什么是好的实践。

Spring中的@service可以被定义为Prototype,@Scope(“Prototype”),检查这里:

您想根据不同的情况获得不同的实例,我认为您应该为一个接口提供更多impl,对吗?您可以使用接口进行自动连接,但您应该决定要获得哪个实例,Spring不能做选择,它只是帮助管理bean。例如,当type=0时,您获得beanA;当type=1时,得到的是bean B;在使用@Autowired之前,您的spring应该已经存放了bean。一种方法可以使用,另一种方法可以使用。bean的作用域是Singlton default。这就是我的答案。

我使用spring而不使用启动部分。如果您能够以某种方式获得上下文对象,您可以做的一个技巧是调用:

context.getAutowireCapableBeanFactory().autowireBean(bean);
在我们的项目中,我们有一个手动构建的上下文查找机制,我们基本上不需要传递。实际上,我试图避免autowire,而是将内容注入
@Configuration
类中,并使这些类成为我处理Spring并进行Spring相关导入的唯一场所。例外是我们的jersey资源类。这些是由jersey而不是Spring实例化的。我知道有一些复杂的技巧需要修复,并使这两个框架能够很好地相互配合。但我只是实现了一个静态方法,它返回静态单例上下文,并在不存在的情况下创建它。另外的优势是,它大大减少了在tartup(春天是美好的,直到它不工作,不告诉你为什么)

在我的资源构造函数中,我只需调用

InbotSpringContextLoader.autowire(this);

您可以从任何组件注入ApplicationContext:

@Autowired private ApplicationContext applicationContext;
然后您可以使用它来获得一个bean:

Class<?> clazz = DemoBean.class;
DemoBean demoBean = (DemoBean)applicationContext.getAutowireCapableBeanFactory().autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_NO, false);
Class clazz=DemoBean.Class;
DemoBean DemoBean=(DemoBean)applicationContext.getAutowireCapableBeanFactory().autowire(clazz,AutowireCapableBeanFactory.autowire_NO,false);

请注意,使用AUTOWIRE\u NO时,任何带有@Autowired注释的成员变量仍将自动连接。

NO,实现始终相同。只有传递给服务的环境对象不同,但处理过程相同。您是否建议使用某种工厂而不是获取新实例?请检查此项:-谢谢!这似乎合适好吧,我的用例!
Class<?> clazz = DemoBean.class;
DemoBean demoBean = (DemoBean)applicationContext.getAutowireCapableBeanFactory().autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_NO, false);