Java 为什么spring会在非托管类中自动@autowired字段
据我所知,spring提供了一些将bean注入非托管类的方法。 这可以通过AutowireCapableBeanFactory显式完成。() 但当spring自动执行这种注入时,我遇到了奇怪的(IMHO)行为 下面是spring batch的一个示例 配置:Java 为什么spring会在非托管类中自动@autowired字段,java,spring,spring-boot,dependency-injection,autowired,Java,Spring,Spring Boot,Dependency Injection,Autowired,据我所知,spring提供了一些将bean注入非托管类的方法。 这可以通过AutowireCapableBeanFactory显式完成。() 但当spring自动执行这种注入时,我遇到了奇怪的(IMHO)行为 下面是spring batch的一个示例 配置: @SpringBootConfiguration public class ProcessorJobConfig { //..... @Bean(name = "pullRestTemplate") public RestTempla
@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;
}
//.....
}
即使我使用显式new()实例化RestMeasureReader,它的RestTemplate字段也将在之后被注入。
这是正常的行为吗?我不希望spring在使用new()创建对象时自动注入字段。如果您谈论的是在
@Configuration
类中使用new
,那么这是正常行为。这是Spring java配置。这就是Spring管理的上下文。您不会在代码中显式调用itemReader()
。
因此,当您要执行此操作时:
@Autowired
private ItemReader<Measurement> iterReader;
@Autowired
私人项目阅读器;
您将从Spring的IoC获得您的RestMeasureReader
实例
但是,如果您试图在代码内部显式调用new RestMesureReader()
,您将得到RestMesureReader
的新实例,而不是带有注入@Autowired
字段的Spring代理
尝试从itemReader()
方法声明中删除@Bean
,事件将无法自动连接RestMesureReader
所以基本上,@Configuration
类只是一个Spring配置,而不是真正的java代码。即使您调用new
Spring,它仍然会返回一个代理类
有关更多信息,请检查。如果您正在谈论在
@Configuration
类中使用新
,那么这是正常行为。这是Spring java配置。这就是Spring管理的上下文。您不会在代码中显式调用itemReader()
。
因此,当您要执行此操作时:
@Autowired
private ItemReader<Measurement> iterReader;
@Autowired
私人项目阅读器;
您将从Spring的IoC获得您的RestMeasureReader
实例
但是,如果您试图在代码内部显式调用new RestMesureReader()
,您将得到RestMesureReader
的新实例,而不是带有注入@Autowired
字段的Spring代理
尝试从itemReader()
方法声明中删除@Bean
,事件将无法自动连接RestMesureReader
所以基本上,@Configuration
类只是一个Spring配置,而不是真正的java代码。即使您调用new
Spring,它仍然会返回一个代理类
有关更多信息,请查看。Spring处理由带
@Bean
这允许您在使用Java配置时使用自动连接或livecycle回调
一个更简单的例子:
@Configuration
public class MyConfiguration {
@Bean
public A a() {
return new A();
}
static class A {
@Autowired
private B b;
@PostConstruct
public void onPostConstruct() {
System.out.println("postConstruct: " + b);
}
}
@Component
static class B {
}
}
在这里,即使名为
a
的bean是手动创建的,Spring也会注入依赖项(b
)并调用@PostConstruct
回调。Spring处理由方法返回的bean,这些方法用@bean
注释
这允许您在使用Java配置时使用自动连接或livecycle回调
一个更简单的例子:
@Configuration
public class MyConfiguration {
@Bean
public A a() {
return new A();
}
static class A {
@Autowired
private B b;
@PostConstruct
public void onPostConstruct() {
System.out.println("postConstruct: " + b);
}
}
@Component
static class B {
}
}
在这里,即使名为
a
的bean是手动创建的,Spring也会注入依赖项(b
)并调用@PostConstruct
回调。您正在用Spring@bean
注释注释的方法内创建一个类的新实例。。。这使它成为一个spring管理的bean。如果您删除@Bean
注释,这将是正确的,因为它不是spring管理的Bean。我建议您阅读参考指南,特别是关于基于java的配置的部分。您正在用spring@Bean
注释的方法内创建一个类的新实例。。。这使它成为一个spring管理的bean。如果您删除@Bean
注释,这将是正确的,因为它不是spring管理的Bean。我建议阅读参考指南,特别是关于基于java的配置的部分。