私が知っている限り、春は管理されていないクラスに豆を注入するいくつかの方法を提供します。 AutowireCapableBeanFactoryを使用して明示的に行うことができます。 (How to inject dependencies into a self-instantiated object in Spring?)なぜ春が自動的に非管理クラスの@Autowitredフィールドになるのですか?
しかし、私は春がそのような注入を自動的に実行すると、奇妙な(IMHO)の動作に直面しました。ここで
は春のバッチを持つ例であり、
構成:
@SpringBootConfiguration
public class ProcessorJobConfig {
//.....
@Bean(name = "pullRestTemplate")
public RestTemplate createPullRestTemplate() {
RestTemplate restTemplate = restTemplateBuilder.build();
return restTemplate;
}
@Bean(name = "step")
public Step step(@Autowired ItemReader<Measurement> itemReader,
@Autowired ItemProcessor<Measurement, Event> itemProcessor,
@Autowired ItemWriter<Event> itemWriter) {
return stepBuilderFactory.get("step")
.<Measurement, Event>chunk(Integer.MAX_VALUE)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.build();
}
@Bean(name = "restProcessorJob")
public Job job(@Qualifier("step") Step step) throws Exception {
return jobBuilderFactory.get("restProcessorJob")
.start(step)
.build();
}
@Bean
public ItemReader<Measurement> itemReader() {
RestMeasureReader restMeasureReader = new RestMeasureReader(); // Use new() explicitly
return restMeasureReader;
}
//.....
}
リーダー:
public class RestMeasureReader implements ItemReader<Measurement> {
private static final Logger LOGGER = LoggerFactory.getLogger(RestMeasureReader.class);
/**
* NOTE: This field will be injected automatically by spring, even we are using new() to create instance of this class.
*/
@Autowired
@Qualifier("pullRestTemplate")
private RestTemplate restTemplate;
@Override
public Measurement read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
// do some stuff
}
}
とアプリケーション自体
@EnableBatchProcessing
@EnableTask
@SpringBootApplication
public class TestAutowiredTaskApplication {
public static void main(String[] args) {
SpringApplication.run(TestAutowiredTaskApplication.class, args);
}
}
でも私は(新しい明示的な使用します)RestMeasureReaderをインスタンス化するには、そのRestTemplateフィールドを後で挿入します。 正常な動作ですか? new()を使ってオブジェクトを作成するとき、春が自動的にフィールドを挿入するとは思わない。
Springの '@ Bean'アノテーションでアノテーションされたメソッドの中に、クラスの新しいインスタンスを作成しています。これは、Spring管理Beanになります。 '@ Bean'アノテーションを削除すると、それは春管理Beanではありません。私は、リファレンスガイド、特にJavaベースの設定に関するセクションを読むことをお勧めします。 –