@Bean работает без @Configuration. Как это все еще может работать без @Configuration? - PullRequest
0 голосов
/ 25 марта 2020

Нижний код - мой программный код Spring Batch. когда вы видите дно, вы можете увидеть проблему кода. нет @Configuration. первоначально было невозможно внедрить классы зависимостей, но это было сделано.

Первое изображение - это мой проводник проекта. Я вставлю dataSource в dataSource в BatchJob, но он не может работать, потому что я не добавил @Configuration в BatchConfiguration. класс, но он все еще работает, даже не @Configuration. так интересно, как можно @Bean DataSource вводить без @Configuration? Вы можете проверить второе изображение, как работает этот проект.

так что, плз, я хочу решить свои вопросы, и вы можете видеть, что полный источник в моем адресе github и моем навыке Engli sh не годится

enter image description here enter image description here

package com.bootbatch.job; 
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.jdbc.datasource.init.DataSourceInitializer; 
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; 
import org.springframework.scheduling.annotation.EnableAsync; 
import org.springframework.scheduling.annotation.EnableScheduling; 
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 
import javax.sql.DataSource; 
@ComponentScan("com.bootbatch") 
@PropertySource("classpath:/database.properties") 
@EnableBatchProcessing 
public class BatchConfiguration { 
    @Autowired 
    private Environment env; 
    @Bean 
    public DataSource dataSource() { 
          DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
          dataSource.setUrl(env.getRequiredProperty("jdbc.url")); 
          dataSource.setUsername(env.getProperty("jdbc.username")); 
          dataSource.setPassword(env.getProperty("jdbc.password")); 
          return dataSource; 
   } 
   @Bean 
   public DataSourceInitializer databasePopulator() { 
     System.out.println("===>databasePopulator에 접속!!"); 
         ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); 
         populator.addScript(new ClassPathResource("org/springframework/batch/core/schema-oracle10g.sql")); 
   //        populator.addScript(new ClassPathResource("truncate_secondjob.sql")); 
         populator.setContinueOnError(true); 
         populator.setIgnoreFailedDrops(true); 
         DataSourceInitializer initializer = new DataSourceInitializer(); 
         initializer.setDatabasePopulator(populator); 
         initializer.setDataSource(dataSource()); 
         return initializer; 
  } 
} 

1 Ответ

1 голос
/ 25 марта 2020

«Проблема» - это ваш собственный код в вашем методе main (который вы случайно забыли включить в свой вопрос!).

@SpringBootApplication
public class SpringBootBatch06Application {

    public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, InterruptedException {
        SpringApplication.run(SpringBootBatch06Application.class, args);

        ApplicationContext context = new AnnotationConfigApplicationContext(BatchConfiguration.class, BatchJob.class);

        // Other code removed
    }   
}

Вы создаете новый AnnotationConfigApplicationContext для этих 2 классов. Который автоматически создаст эти 2 класса компонентов (независимо от аннотации @Component или @Configuration). Таким образом, вы в основном работаете с Spring Boot и его автоматической настройкой (возможно, потому что он не работает).

Для @Components также разрешено иметь @Bean методы, они будут работать в так называемом "lite @Bean Mode" (см. этот раздел Справочного руководства Spring).

Так как они теперь являются в первую очередь компонентами (или bean-компонентами) и имеют @Bean методы, они будут производить новые bean-компоненты (хотя не так, как вы думаете, читайте вышеупомянутую документацию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...