Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么spring会在非托管类中自动@autowired字段_Java_Spring_Spring Boot_Dependency Injection_Autowired - Fatal编程技术网

Java 为什么spring会在非托管类中自动@autowired字段

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

据我所知,spring提供了一些将bean注入非托管类的方法。 这可以通过AutowireCapableBeanFactory显式完成。()

但当spring自动执行这种注入时,我遇到了奇怪的(IMHO)行为

下面是spring batch的一个示例

配置:

@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的配置的部分。